我对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以不同的方式结束并避免这种等待?
答案 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
子进程。