#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int &statloc);
pid_t waitpid(pid_t pid,int *statloc, int options);
Both return:process ID if OK,-1 on error
a 阻塞(如果它的子进程还在运行)
b 立即返回子进程结束信息(如果一个子进程已经结束并等待父进程获取信息)
c 返回错误(如果不存在子进程)
Macro | Description |
WIFEXITED(status) | 如果status是由一个正常结束的进程产生的则值为真,此时我们可以继续使用宏WEXITSTATUS(status)来 |
WIFSIGNALED(status) | 如果status是由一个异常结束(接受到一个信号)的进程产生的则值为真,此时使用宏WTERMSIG(status)来获取信号数。 |
WIFSTOPPED(status) | 如果status是由一个接受到信号目前终止的进程产生的 |
WNOHANG
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
pid==-1 等待任何一个子进程,此时waitpid的作用与wait相同
pid >0
pid==0
pid<-1
1 waitpid使我们可以等待指定的进程
2 waitpid提供了一个无阻塞的wait
3 waitpid支持工作控制
也可以用消息队列吧,子进程退出前把自已的PID写进队列
然后父进程去读,不过pid = waitpid(-1, &stat, 0);
让父进程阻塞在调用这块,不过如果你想让waitpid快带返回也行, 如果没接到子进程退出信号,你可以把这个PID再写进去,然后继续读,直到接到SIGCHLD为止。
以前在项目中遇到过此问题,大量的并发进程往往造成很多的僵死进程,以至于程序无法响应,当时被这个问题弄得很头痛,直到想到这个方法以后才有效的解决了上述问题。
为方法就等于实现了一个对SIGCHLD的排队机制。我一直在大型的项目中用这个,很不错。