处理SIGCHLD,如何记录孩子死亡时的返回值

时间:2011-04-03 16:36:14

标签: c linux unix signals low-level

void childSignalHandler(int signo) {
    int status;

    pid_t pid = wait(&status);

    struct PIDList* record = getRecordForPID(childlist, pid);
    if (record != NULL)
        record->returnValue = status;
}

快速提问:

我想要这个处理程序,当一个孩子死了(这个应用程序产生了很多孩子),得到他们的返回值并记录它(最后三行)。这样做了,还是我把所有这些API业务弄错了?

感谢您的时间!

(同样,linux API术语令人毛骨悚然,检查死去的孩子等等)

2 个答案:

答案 0 :(得分:4)

如果您将函数设置为SIGCHLD的处理程序,那么这应该可以完成。

但是,在孩子退出后,SIGCHLD不仅可以发送到父进程 。其他一些事件也以这种方式发出信号(例如当孩子停止时)。有关详细说明,请参阅man wait(3)

答案 1 :(得分:4)

音符信号未排队。如果两个孩子连续死亡,你可能只会收到一个SIGCHLD。因此,您实际上应该循环调用waitpid(),直到没有更多要处理的进程:

int status;
pid_t pid;

while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
    if (WIFEXITED(status)) {
        struct PIDList *record = getRecordForPID(childlist, pid);

        if (record != NULL)
            record->returnValue = WEXITSTATUS(status);
    }
}