主进程如何监控子进程状态?如果子进程非正常退出呢?
如题,在多进程处理过程中,如果子进程非正常退出了怎么办?
我查到这样一个函数:
pid_t wait(int *status)
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
但是如果使用wait的话,有一个问题就是,一旦使用了wait,那么主进程
就没办法做其他的事情了。
有没有办法使得wait超时退出阻塞?我想了两个办法,大家给点意见看是否可行:
1.用alarm做一个定时器,定时器响应时候的SIGALRM是否会是wait响应而退出。(因为信号是会影响到wait函数的)
2.使用多进程+多线程模式(类似apache的MPM),在主进程中单独开一个线程执行wait,这时候的阻塞是否会影响其他线程?
如果有其他的好办法,也可以。
先谢谢回帖的各位了
我查到这样一个函数:
pid_t wait(int *status)
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
但是如果使用wait的话,有一个问题就是,一旦使用了wait,那么主进程
就没办法做其他的事情了。
有没有办法使得wait超时退出阻塞?我想了两个办法,大家给点意见看是否可行:
1.用alarm做一个定时器,定时器响应时候的SIGALRM是否会是wait响应而退出。(因为信号是会影响到wait函数的)
2.使用多进程+多线程模式(类似apache的MPM),在主进程中单独开一个线程执行wait,这时候的阻塞是否会影响其他线程?
如果有其他的好办法,也可以。
先谢谢回帖的各位了
...全文
相关推荐
linux waitpid检测子进程是否退出
fork 创建子进程,由父进程检测子进程是否退出,子进程退出后重新启动。
C++如何实时监测另一个进程是否已经退出?(附源码)
调用WaitForSingleObject实时监测目标进程是否已经退出
libev 监控子进程
父进程利用ev_child 库监控子进程。 本人经过查阅资料编写的一个简单进程监控demo,其中用到libev库中相关技术,测试时编译运行文件内的代码,他会打印子进程的ID,然后在控制台的kill命令杀死该进程id, 程序会检测到子进程已被杀死,并重新创建子进程。
监控子进程异常退出的示例
用C#实现的 进程间通信小例子 监控子进程异常退出的示例
详解bash中的退出状态机制
程序的退出状态 当一个程序结束时会向父进程报告自己的退出状态( exit status ). 通过传递 int 类型的变量给库函数 exit 或系统调用 _exit 可以设置当前程序的退出状态, 在 Linux 中, 通过 WEXITSTATUS 返回的退出状态的值域为 [0, 255] 之间的整数 . 如果传递的值不在这个范围内, 内核会自动帮你强转为 u_int8_t . 通过 waitpid 库函数可以得到子进程的退出状态, 其值存储在参数 wstatus 的低 8 位中. // 定义在 wait.h 中 # define WEXITSTATUS(status) __WEXITST


