* nix wait()和wait_pid()在演示程序中工作
(1)父亲请孩子,等孩子退出
(2)并且等待函数返回。
强调的是,如果父亲不等待并继续跑步,孩子们就会退出并成为“僵尸”。
但现实世界* nix编程就像
(1)我正在写一个服务器程序,
(2)主要过程适用于分叉一些童工,
(3)这些童工做了一些工作,然后退出。
然后问题是,父亲如何处理fork并等待多个孩子?有没有方便的方法来做到这一点,或者设计应该是不同的?
感谢。
答案 0 :(得分:1)
三种可能性:
1) 定期检查有waitpid的死孩子。即:现在又做:
while (waitpid(-1, NULL, WNOHANG) > 0)
continue;
2) 在信号处理程序中清理
/* SIGCHLD handler to reap dead child processes */
static void grimReaper(int sig)
{
int savedErrno = errno;
while (waitpid(-1, NULL, WNOHANG) > 0)
continue;
errno = savedErrno;
}
int main(void) {
...
struct sigaction sa;
memset(&sa, 0, sizeof sa);
sigemptyset(&sa.sa_mask);
sa.sa_handler = grimReaper;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
...
}
3)
通过忽略父级中的SIGCHLD
来使分离的孩子成为:
signal(SIGCHLD, SIG_IGN);