免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flyhu
打印 上一主题 下一主题

!!并发守护进程的问题(急)!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-24 23:06 |只看该作者
原帖由 gczh1006 于 2007-8-24 22:58 发表
fprintf 不太安全吧?

写完就想到了,即便每次fflush都靠不住:)

论坛徽章:
0
12 [报告]
发表于 2007-08-24 23:21 |只看该作者
原帖由 _pp_ 于 2007-8-24 22:59 发表
找本UNPV12e抄个预分配的服务器吧
你那个太逊了。
daemon_init把所有文件句柄都关了,就不能printf啦。


daemon_init把所有文件句柄都关掉,是因为楼主需要的是守护进程.如果需要记录输出,可以再打开一个文件使用write()向文件中写入数据.

论坛徽章:
0
13 [报告]
发表于 2007-08-24 23:37 |只看该作者
原帖由 ivhb 于 2007-8-24 23:06 发表

写完就想到了,即便每次fflush都靠不住:)



对写log加锁是一种习惯的方式

这段代码如果只是write调用,不加锁也罢

但是,一般在log日志中,会记录一些有用的信息,比如时间,FILE, LINE 等,加锁后能确保代码的正确执行……

论坛徽章:
0
14 [报告]
发表于 2007-08-24 23:40 |只看该作者
>如何来控制,主进程不被重复启动呢?通过锁pid文件?最好方案是什么呢?

可以通过一shell来检测 ,放在crontab中。

当然,这不一定是最佳方案,只是提出一种可以的实现而已……

论坛徽章:
0
15 [报告]
发表于 2007-08-25 11:33 |只看该作者
原帖由 ivhb 于 2007-8-24 22:26 发表
3、我如何来停止我的主进程和进程呢?并保持里面对数据库的事务一致。
这一条很难做到吧。跨进程保持事务一致? 很难。


不跨进程。。

我是在主进程中打开一个游标,去从数据据库中取数据。

我现在是想通过 daemon -k,来停掉主进程,目前可以通过操作系统的kill来实现。

但我想在kill前,先让主程序,能把与数据库的链接自己关掉!!

论坛徽章:
0
16 [报告]
发表于 2007-08-25 11:38 |只看该作者
不是很明白,你的主进程好像就是读取数据,并没有更改吧。有什么不能保持一致的?

论坛徽章:
0
17 [报告]
发表于 2007-08-25 11:46 |只看该作者
原帖由 flyhu 于 2007-8-25 11:33 发表


不跨进程。。

我是在主进程中打开一个游标,去从数据据库中取数据。

我现在是想通过 daemon -k,来停掉主进程,目前可以通过操作系统的kill来实现。

但我想在kill前,先让主程序,能把与数据库的链 ...



那就采用信号处理的方式吧, 自己注册一个信号, 在接收到信号之后, 完成善后工作. 然后退出.

论坛徽章:
0
18 [报告]
发表于 2007-08-25 13:32 |只看该作者
程序写了一半了,但遇到一种情况,不知道如何来处理,描述如下,还请大家帮助出出注意:
在上面的框架中,程序分两步来做:
1、第一步产生先五个进程,参照前面的代码。
while (i--)
{
。。。。。。  
           if (pid == 0)
                {
                        fun(5-i-1);
                        exit(0);
                }
}
2、第二步,用wait等待,没有一个再新产生一个。
  j = 5;
  while (wait(NULL) > 0)
  {
  。。。。。   
          i f (pid == 0)
                {
                        fun(j);
                        exit(0);
                }   
  }
我的遇到情况是:
我在数据库中的作业表中,可能一开始的时候,我的作业表中,就没有五个作业。
在第一步中,可能只产生了2个作业,或者根本就没产生作业。
那么在第二步,还能等待五个作业的产生?好像不能吧,只能等待第一步的2个作业。
如果第一步没有产生,第二步是不是就直接退出了?

我是否应该在第一步中,加入循环等待,必须满5个,才能到第二步?
另外,第一步中的fun和第二步中的fun可以不同吧。。我是不是可以让第一步先空产生5个子进程。
在第二步中,从数据库取作业,再做具体的业务处理。

论坛徽章:
0
19 [报告]
发表于 2007-08-25 13:42 |只看该作者
while (i--)
{
    fetch 你的任务配置表
   if (SQLCODE == SQLNOTFOUND)  // all tasks activated
       break;
。。。。。。  
           if (pid == 0)
                {
                        fun(5-i-1);
                        exit(0);
                }
}

while (wait() > 0) {
   fetch
   if (SQLCODE == SQLNOTFOUND)
     continue;
   fork()
}

//这个逻辑有问题么?
func是你自己定义的,当然可以不同。有什么任务就调什么样的func呗。
反正fork一次,就是调用一个任务。没有任务就不fork(),很直观吧。

[ 本帖最后由 ivhb 于 2007-8-25 13:45 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2007-08-25 14:22 |只看该作者
原帖由 scutan 于 2007-8-25 11:46 发表



那就采用信号处理的方式吧, 自己注册一个信号, 在接收到信号之后, 完成善后工作. 然后退出.


用信号,是不是子进程也能收到?都是同样的处理方式?如何区分?

能够给一个信号处理示例吗?十分感谢。。我的程序框架都出来,多谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP