处理SIGCHLD,如何logging孩子死后的返回值

void childSignalHandler(int signo) { int status; pid_t pid = wait(&status); struct PIDList* record = getRecordForPID(childlist, pid); if (record != NULL) record->returnValue = status; } 

快速提问:

我希望这个处理程序,当一个孩子死亡(这个应用程序产生大量的孩子),得到它们的返回值并logging它(最后三行)。 这是否会做到这一点,还是我所有的API业务是错的?

感谢您的时间!

(另外,linux API术语令人毛骨悚然,检查垂死的孩子和什么)

Solutions Collecting From Web of "处理SIGCHLD,如何logging孩子死后的返回值"

如果你把你的函数设置为SIGCHLD的处理函数,这应该可以完成这个工作。

但是, SIGCHLD 不仅可以在孩子退出之后发送给父进程。 还有一些其他的事件也是这样表示的(例如,当孩子停止时)。 (3)详细解释见男人 。

注意信号不排队。 如果两个孩子连续死亡,你只能收到一个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); } }