如何等待子进程发送信号?
#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识别)发送信号的信息,这是您解决方案的关键。