3

我对 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() 将启动,当它到达“end = wait(NULL)”行时,程序会一直等到我拥有的另一个孩子完成。

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

4

1 回答 1

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.

于 2012-12-01T15:02:19.267 回答