主进程如何监控子进程状态?如果子进程非正常退出呢?

joseph_hsw 2014-02-19 09:44:44
如题,在多进程处理过程中,如果子进程非正常退出了怎么办?
我查到这样一个函数:
pid_t wait(int *status)     
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

但是如果使用wait的话,有一个问题就是,一旦使用了wait,那么主进程
就没办法做其他的事情了。
有没有办法使得wait超时退出阻塞?我想了两个办法,大家给点意见看是否可行:
1.用alarm做一个定时器,定时器响应时候的SIGALRM是否会是wait响应而退出。(因为信号是会影响到wait函数的)
2.使用多进程+多线程模式(类似apache的MPM),在主进程中单独开一个线程执行wait,这时候的阻塞是否会影响其他线程?

如果有其他的好办法,也可以。
先谢谢回帖的各位了
...全文
351 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
joseph_hsw 2014-02-19
  • 打赏
  • 举报
回复
类似如下SIGCHLD的响应函数的话,应该不会阻塞了吧。 void sig_chld(int signo) { pid_t pid; int stat; while((pid = waitpid(-1, &stat, WNOHANG)) > 0){ printf("child %d terminated\n", pid); } return; }
joseph_hsw 2014-02-19
  • 打赏
  • 举报
回复
或者直接捕捉“SIGCHLD”信号?
joseph_hsw 2014-02-19
  • 打赏
  • 举报
回复
谢谢楼上各位了。 测试了下。 决定采取响应SIGCHLD来确定。
edward_lii 2014-02-19
  • 打赏
  • 举报
回复
void sig_chld(int signo) { pid_t pid; int stat; while((pid = waitpid(-1, &stat, WNOHANG)) > 0){ printf("child %d terminated\n", pid); } return; } 感觉这方法靠谱
大道曙光 2014-02-19
  • 打赏
  • 举报
回复
前排围观学习。 以前,在用SDK写程序的时候,我也遇到过这种情况,当时自己的做法是(仅供参考): 主进程创建子进程后,在创建一个线程,并把子进程的句柄传递到这个线程里,然后就 WaitForSingleObject吧。(一旦子进程结束,它就变成已通知状态了) 接下来再判断子进程的退出代码。 …… http://blog.csdn.net/ubiter/article/details/10363601
赵4老师 2014-02-19
  • 打赏
  • 举报
回复
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·……
赵4老师 2014-02-19
  • 打赏
  • 举报
回复
先让子进程每隔比如30秒打开某个日志文件,往最后添加一行信息,关闭; 再在主进程中每隔比如90秒检查这个日志文件的最后修改日期时间,如果和上次检查获得的日期时间相比没有变化,就说明被监视的子进程挂死或非正常退出了。
nadleeh 2014-02-19
  • 打赏
  • 举报
回复
引用 2 楼 u011339091 的回复:
类似如下SIGCHLD的响应函数的话,应该不会阻塞了吧。 void sig_chld(int signo) { pid_t pid; int stat; while((pid = waitpid(-1, &stat, WNOHANG)) > 0){ printf("child %d terminated\n", pid); } return; }
linux 和fork相关函数都能通过一些手段得到子进程的状态,话说回来活要见人死要见尸。
Re: 《Linux 进程管理命令》   ---------------------------------------内容提要: 01/15)命令 ps         :查看进程(快照)02/15)命令 pstree   :显示进程状态树03/15)命令 pgrep   :查找匹配条件的进程04/15)命令 kill        :终止进程号(1277)05/15)命令 killall    :通过进程名(nginx)终止进程(父/进程)06/15)命令 pkill      :通过进程名终止进程(通杀)/终止客户端(pst/tty)07/15)命令 top       :实时显示系统中各个进程的资源占用状况(录像)08/15)命令 nice      :调整程序运行时的优先级09/15)命令 renice   :调整运行中的进程的优先级10/15)命令 nohup  :用户退出系统,进程继续工作11/15)命令 strace   :跟踪进程的系统调用12/15)命令 ltrace    :跟踪进程调用库函数13/15)命令 runlevel:输出当前运行级别14/15)命令 init        :初始化 Linux 进程15/15)命令 service  :管理系统服务  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧