在C多处理中,如何等待正好两个信号



在主函数中,我创建了一个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(。等等

相关内容

  • 没有找到相关文章

最新更新