如何等待子进程发送信号?

#include  #include  #include  #include  void handler(int signumber) { return; } int main() { int i, pid; int children_count = 5; int arr_childprocesses[5]; int parent_pid = getpid(); for(i=0;i<children_count;i++) { pid = fork(); if(pid == -1) { perror("Err"); exit(EXIT_FAILURE); } if(pid == 0) break; arr_childprocesses[i] = pid; } if (pid == 0) // children { kill(parent_pid,SIGUSR1); printf("Child(%d) sig sent. Waiting 5s...\n",getpid()); sleep(5); printf("Child(%d) terminated.\n",getpid()); } else // parent { signal(SIGUSR1,handler); for(i=0;i<children_count;++i) { waitpid(arr_childprocesses[i],NULL,0); printf("Parent: Signal received.\n"); } printf("Parent(%d) signals received. Waiting 3s...\n",getpid()); sleep(3); printf("Parent(%d) terminated.\n",getpid()); } exit(EXIT_SUCCESS); } 

我想等到所有的孩子都给我发信号。 然后与孩子们和父母一起做一些工作。 但程序会停止,直到所有孩子都终止。 我该怎么做?

结果:

在此处输入图像描述

更新1:包含完整代码加结果

你可能在这里面对一场比赛。

父级在设置此信号的处理程序之前接收SIGUSR1 。 由于接收SIGUSR1的默认行为即将结束,因此父级会死亡。

您希望在分离子项之前在父项内设置信号处理程序。

(如果从程序设计中,对于孩子设置SIGUSR1信号处理程序是不可接受的,只需调用signal(SIGUSR1, SIG_DFL)作为子内部的第一个语句来卸载此处理程序。)

为了certificate这个理论,你可能想暂时加一个sleep(1); 在调用kill()之前的孩子里面。


作为完成任务的提示:

看一下sigaction()因为它提供了一个更强大的信号接口,然后是函数signal() 。 特别是读取SA_SIGINFO标志,因为它允许将siginfo_t类型变量传递给信号处理程序。 后一个变量携带有关谁(由PID识别)发送信号的信息,这是您解决方案的关键。