多个信号到达处理程序

时间:2015-04-10 07:05:12

标签: c signals sigaction

我有一个主流程,它分叉了一些孩子的过程。

每个孩子做某事并阻止自己。通过阻止自己,每个孩子都会向父进程发送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)都发送信号。处理完孩子(1)之后,处理程序是否会运行这些信号,或者这些信号会被忽略吗?

1 个答案:

答案 0 :(得分:0)

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