[英]How to wait for the children processes to send signals?
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
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)
作為子內部的第一個語句來卸載此處理程序。)
為了證明這個理論,你可能想暫時加一個sleep(1);
在調用kill()
之前的孩子里面。
作為完成任務的提示:
看看sigaction()
因為它提供了一個更強大的信號接口,然后是函數signal()
。 特別是讀取SA_SIGINFO
標志,因為它允許將siginfo_t
類型變量傳遞給信號處理程序。 后一個變量帶有關於誰(由PID識別)發送信號的信息,這是解決方案的關鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.