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术语令人毛骨悚然,检查死去的孩子等等)
答案 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);
}
}