免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 15610 | 回复: 40

子进程及时知道父进程已经退出的最简单方案? [复制链接]

论坛徽章:
0
发表于 2003-08-11 11:29 |显示全部楼层
要父进程知道子进程退出,这太容易了,但是要子进程知道父进程退出,可有点麻烦。

     父进程如果退出,子进程如何知道呢,最笨的方法,父子进程之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道,可以吗?如何做?有更加简单的方法吗?

欢迎高手提出最简单的办法

论坛徽章:
0
发表于 2003-08-11 11:52 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

肯定不能这样实现,否则程序性能没办法保证

论坛徽章:
0
发表于 2003-08-11 12:27 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

我目前想的方法,只有用个管道,父进程每隔一秒向管道中写,子进程接收,子进程一段时间从管道中读不到字符,就认为父进程已经退出。但是这方法实在笨,想一想,又想不出好办法。要不,在子进程中使用ps命令,这方法也很土呀。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2003-08-11 12:54 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

可以考虑在父进程退出时给子进程发送信号。SIGUSR1。

论坛徽章:
0
发表于 2003-08-11 12:57 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

你的需求到底是什么?父进程退出了,子进程也会退出,此时会收到SIGTERM信号。
如果在子进程里setpgrp,那可以用所有的IPC手段去通知子进程,flw的比较实用。

论坛徽章:
0
发表于 2003-08-11 13:08 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

[quote]原帖由 "flw"]可以考虑在父进程退出时给子进程发送信号。SIGUSR1。[/quote 发表:
     这只能处理父进程正常退出时的情况,如果父进程不是正常退出,而是遭遇了”kill -9 进程号“退出时,父进程就来不及用SIGUSR1通知子进程,就会退出,子进程照样不知道父进程的状态改变。因而这种方法好象没有办法实现“可靠地通知子进程”。

论坛徽章:
0
发表于 2003-08-11 13:11 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

呵呵,kill -9谁也处理不了的,只能认命。这是满门抄斩的招法。

论坛徽章:
0
发表于 2003-08-11 13:12 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

flw的办法还是挺实用的。
试试开个管道,子进程监视管道是否还开着。不需要实际的读写,只是监视它的状态
或者父进程锁一个文件,子进程如果"不“能得到锁,说明父进程它老人家还健在。

论坛徽章:
0
发表于 2003-08-11 13:15 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

原帖由 "fieryfox" 发表:
你的需求到底是什么?父进程退出了,子进程也会退出,此时会收到SIGTERM信号。
如果在子进程里setpgrp,那可以用所有的IPC手段去通知子进程,flw的比较实用。
   

哦,你的意思是如果父进程退出,子进程如果没有setpgrp,就会收到SIGTERM信号,是吗?我马上尝试一下。谢谢了!

论坛徽章:
0
发表于 2003-08-11 13:33 |显示全部楼层

子进程及时知道父进程已经退出的最简单方案?

原帖由 "fieryfox" 发表:
你的需求到底是什么?父进程退出了,子进程也会退出,此时会收到SIGTERM信号。
如果在子进程里setpgrp,那可以用所有的IPC手段去通知子进程,flw的比较实用。
    在BSD下试了一下似乎不中啊!

  1. static void     sig_term(int);

  2. int
  3. main(void)
  4. {
  5.         pid_t pid;

  6.         if (signal(SIGTERM, sig_term) == SIG_ERR) {
  7.                 printf("can't catch SIGTERM\n");
  8.                 exit(1);
  9.         }

  10.         pid = fork();
  11.         if (pid >; 0) {
  12.                 sleep(1);
  13.                 exit(0);
  14.         }

  15.         for ( ; ; )
  16.                 sleep(1);
  17. }

  18. static void
  19. sig_term(int signo)
  20. {
  21.         printf("received signal %d\n", signo);
  22.         return;
  23. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP