我有一个主流程,它分叉了一些孩子的过程。
每个孩子做某事并阻止自己。通过阻止自己,每个孩子都会向父进程发送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)之后,处理程序是否会运行这些信号,或者这些信号会被忽略吗?
答案 0 :(得分:0)
SIGCHLD
有点特别之处在于每个退出的孩子只能获得一个信号;这些信号与它们对应的子进程留下的相应僵尸/等待状态相关联。但一般来说,大多数信号只是标志,而不是队列。如果可能,最好不要使用SIGCHLD
,而只是使用waitpid
并以其他方式跟踪子退出(例如,通过观察{{1}中孩子的管道上的EOF状态循环等等。