在主函数中,我创建了一个sigaction sigact";它连接到处理程序,并且我从阻塞的sigact.sa_mask集合中删除了SIGUSR1信号SIGUSR1是我想从两个孩子那里得到两次的信号,然后再进一步。如何等待两个子进程从中获取SIGUSR1信号?
void handler(...){...}
int main()
{
int pipe1[2];
int pipe2[2];
char buf;
struct sigaction sigact;
sigact.sa_handler = handler;
sigfillset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigdelset(&sigact.sa_mask,SIGUSR1);
sigaction(SIGUSR1,&sigact,NULL);
pid = fork();
if(pid == 0){
...
sleep(3); // the sleep is just a must-have of the homework
kill(getppid(),SIGUSR1); // CHILD1
...
}else{
pid1 = fork();
if(pid1 == 0){
...
sleep(3);
kill(getppid(),SIGUSR1); // CHILD2
...
}else{
...
sigsuspend(&sigact.sa_mask); // PARENT
sigsuspend(&sigact.sa_mask); // WAIT FOR SIGUSR1 FROM CHILD1 AND
... // CHILD2 BEFORE GOING FURTHER
... // (The two sigsuspends were my best idea,
... // doesn't work)
// DO OTHER THINGS AFTER TWO SIGNALS CAME
// (e.g. sending children data with pipes,
// just homework stuff...)
}
}
return 0;
}
正如你所看到的,我正在尝试使用两个信号,但它们不起作用,它将永远等待。只使用一个sigsuspend就可以了,但我需要两个孩子的反馈。
如何等待2个信号
如果有约束,这是不可靠的。把这个家庭作业往后推。
如果两个SIGUSR1信号"到达";同时;一个将丢失,因为相同类型的普通UNIX信号不排队。您不能控制这个时间--操作系统调度程序可以控制。
所以,做点别的吧。使用可以对至少32个(_POSIX_SIGQUEUE_MAX(未决信号进行排队的实时信号。使用子级和父级之间的管道进行通信。每个进程使用不同的普通信号(例如SIGUSR1和SIGUSR2(。等等