10

我试图弄清楚发送 SIGCHLD 信号的进程的 pid 是什么,我想在为 SIGCHLD 创建的信号处理程序中执行此操作。我该怎么做?我正在努力:

int pid = waitpid(-1, NULL, WNOHANG);

因为我想等待任何产生的子进程。

4

1 回答 1

11

如果您使用waitpid()或多或少如图所示,您将被告知其中一个已死亡的子进程的 PID - 通常,这将是唯一已死亡的进程,但如果您得到一连串它们,您可能会得到一个信号和许多尸体要收集。所以,使用:

void sigchld_handler(int signum)
{
    pid_t pid;
    int   status;
    while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
    {
        unregister_child(pid, status);   // Or whatever you need to do with the PID
    }
}

如果您不关心孩子的退出状态,您可以替换&status为。NULL

不同的系统记录的返回值waitpid()略有不同。但是,POSIX 是比较谨慎的一种,它说:

如果wait()waitpid()因为子进程的状态可用而返回,这些函数应返回一个等于报告状态的子进程的进程 ID 的值。如果wait()waitpid()由于向调用进程传递信号而返回,则应返回 -1 并将 errno 设置为 [EINTR]。如果waitpid()在options中设置了WNOHANG被调用,它至少有一个pid指定的子进程的status不可用,并且pid指定的任何进程的status都不可用,返回0。否则,应返回 -1,并设置 errno 以指示错误。

于 2010-04-08T00:24:08.860 回答