LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 646|回复: 3

如何控制多个程序的退出顺序

[复制链接]
发表于 2007-3-31 22:07:30 | 显示全部楼层 |阅读模式
比如主程序A有两个子程序B和C;
在A主程序退出时要先发送SIGTERM给C,让它做稍长时间的清理(期间还要和用unix domain socket和B通信)然后退出,最后发送SIGTERM给B让它退出;

我现在是这样做的:
在A主程序中捕捉SIGTERM和SIGCHLD,并且通过全局变量C_proc_exited来判断C有没有已经退出;

对SIGCHLD信号的处理函数:

  1. void child_exit(int sig) {
  2.         int pid;
  3.         while((pid = waitpid(-1,0,WNOHANG)) > 0) {
  4.                 if(pid == C_proc_id)
  5.                         C_proc_exited = 1;
  6.         }
  7.         return;
  8. }
复制代码


对SIGTERM信号的处理函数:

  1. void program_exit(int sig) {
  2.         kill(C_proc_id,SIGTERM);
  3.         while(!C_proc_exited) {
  4.                 sleep(1);       
  5.         }
  6.         kill(B_proc_id,SIGTERM);
  7.         exit(0);
  8. }
复制代码


看起来应该没有什么问题,但是用在自己的程序中发现有时还是B比C先退出,可能有些不可靠的地方;
有谁有更好的办法来控制多个程序的退出顺序
发表于 2007-4-1 01:54:22 | 显示全部楼层
是不是和C_proc_exited定义有关系,需要加volatile
回复 支持 反对

使用道具 举报

发表于 2007-4-1 14:31:12 | 显示全部楼层
Linux的进程间同步的方法很多,对你的需求,采用信号量(semaphore)比较适合。目前你用的先发信号再轮询的办法不太可靠。

信号量 X, Y, Z
主进程M
子进程A
子进程B

主进程M启动:创建信号量X=1,Y=1,Z=1

子进程B离开条件:X=0
子进程B退出时设置:Z=0

子进程A退出条件:Z=0
子进程A退出时设置:Y=0

主进程M退出条件:Y=0
主进程M收到SIGKILL信号时设置:X=0

如果你想这棵进程树按B->A->M次序终止,给主进程M发个KILL信号就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-1 20:15:37 | 显示全部楼层
找到原因了
我不知道ctrl + c不但会向主程序还会向所有的子程序发送SIGINT
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表