c中的SIGCHLD处理程序 - 不需要的等待

时间:2012-12-01 14:49:05

标签: c signals sigchld

我对SIGCHLD处理函数存在以下问题。

处理程序代码非常简单:

void sigchld_handler(int signum)
{
    pid_t ended;    
    signal(SIGCHLD, sigchld_handler);
    ended = wait(NULL);
    // do some stuff with the PID of the finished child process
}

当我只分叉一个孩子时,这很有效。如果我有2个孩子(或更多)并且其中一个已经完成运行,则sigchld_handler()启动,当它到达“ends = wait(NULL)”行时,程序将一直等到我完成的另一个孩子。 / p>

有没有办法让孩子的PID以不同的方式结束并避免这种等待?

1 个答案:

答案 0 :(得分:3)

使用sigaction()代替,处理程序将具有此签名:

void (*sa_sigaction)(int, siginfo_t *, void *);

它从手册页中传递了您在struct siginfo_t中所需的信息:

  

SIGCHLD填写 si_pid ,si_uid,si_status,si_utime和si_stime,   提供有关孩子的信息。 si_pid字段是   孩子的进程ID

注意:当然,除非您使用wait(),否则您仍然需要SA_NOCLDWAIT子进程。