我需要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)
Run Code Online (Sandbox Code Playgroud)
如果我删除sleep然后父执行第一..为什么?
cni*_*tar 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);
Run Code Online (Sandbox Code Playgroud)
当然,这都是毫无意义的.如果父母只是忽略SIGCHLD,孩子们会默默地收获,不会变成僵尸.
引用TLPI:
明确地将SIGCHLD的处置设置为SIG_IGN会导致随后终止的任何子进程立即从系统中删除而不是转换为僵尸.
所以像这样的东西应该为你做的伎俩:
signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32061 次 |
| 最近记录: |