我需要正确处理SIGCHLD
。如何在现有代码中使用它。目前我无法等待子进程,除非我使用0
代替WNOHANG|WUNTRACED
。
status = 0;
pid_t child, endID;
if(amp == 1)
signal( SIGCHLD, SIG_IGN );
child = fork();
if (child < 0) {
perror("fork() error\n");
exit(EXIT_FAILURE);
} else if (child == 0) {
// do sth here
perror("error\n");
} else {
//sleep(1)
如果我删除sleep
,那么父亲会被执行第一个......为什么?
答案 0 :(得分:26)
这是一个开始(但在下面阅读):
static void
child_handler(int sig)
{
pid_t pid;
int status;
/* EEEEXTEERMINAAATE! */
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;
}
/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;
sigaction(SIGCHLD, &sa, NULL);
当然,这都是毫无意义的。如果父母只是忽略SIGCHLD
,孩子们就会默默地收获,不会变成僵尸。
引用TLPI:
明确地将SIGCHLD的处置设置为SIG_IGN会导致任何问题 随后终止的子进程立即被删除 从系统而不是转换为僵尸。
所以这样的事情可以帮到你:
signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */