4

我有一个分叉了一些子进程的主进程。

每个孩子都会做一些事情并阻止自己。SICHLD通过阻塞自己,每个子进程都会向父进程发送信号。

我还在sigaction主流程代码中声明了一个动作,以捕捉SIGCLHD孩子们将发送的动作。

static struct sigaction action;
action.sa_handler = handler 
sigfillset(&(action.sa_mask));
sigaction(SIGCHLD, &action, NULL);

处理程序在SIGCHLD调用时检查哪个孩子发送了SIGCHLD信号并为那个孩子做一些事情。

问题是,如果多个孩子同时发送信号会发生什么?假设孩子(1)发送了SIGCHLD. 处理程序捕获它并且在他完成句柄之前,kid(2) 和kid(3) 都发送信号。处理程序是否会在处理完 child(1) 后针对每个信号运行,还是会忽略这些信号?

4

1 回答 1

0

SIGCHLD有点特别之处在于,每个退出的孩子只会得到一个信号;这些信号与它们对应的子进程留下的相应僵尸/等待状态相关联。但一般来说,大多数信号只是标志,而不是队列。如果可能的话,最好不要使用SIGCHLD,而是waitpid以其他方式使用和跟踪子退出(例如,通过从poll循环中的子等观察管道上的 EOF 状态)。

于 2015-04-10T07:35:17.857 回答