C 多个信号到达处理程序

C 多个信号到达处理程序,c,signals,sigaction,C,Signals,Sigaction,我有一个主流程,它派生了一些kid流程 每个孩子都会做些什么,然后自我封闭。通过阻塞自身,每个子进程向父进程发送一个SICHLD信号 我还在主流程代码中声明了一个sigaction操作,以便捕获孩子们将发送的SIGCLHD static struct sigaction action; action.sa_handler = handler sigfillset(&(action.sa_mask)); sigaction(SIGCHLD, &action, NULL); 调用

我有一个主流程,它派生了一些kid流程

每个孩子都会做些什么,然后自我封闭。通过阻塞自身,每个子进程向父进程发送一个
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)都发送信号。在处理完kid(1)之后,处理程序会为这些信号中的每一个运行吗?还是这些信号会被忽略?

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

检查子进程在执行任务时不退出,它只是将状态更改为“已停止”。我已经在使用waitpid来查看哪个孩子将状态更改为“stopped”。嗯,我不确定停止的确切规则,但我认为它们是相同的,除了可能在信号能够传递之前停止的进程恢复的情况下。。。