我该如何处理SIGCHLD?

kan*_*noz 12 c sigchld

我需要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)

  • 我应该在哪里调用这种方法? (2认同)