在c、linux中使用信号进行进程间同步

在c、linux中使用信号进行进程间同步,c,linux,process,synchronization,signals,C,Linux,Process,Synchronization,Signals,进程A分叉表示4个子进程。exec()用于替换子级的代码。子项初始化,并且必须等待父项创建所有4个子项 然后父进程向每个子进程发送一个sigusr1,以便它们开始处理。父进程等待所有子进程完成。孩子完成工作后,会向家长发送一个sigusr2。当父进程接收到所有sigusr2信号时,它将继续执行,合并子进程的计算 这是一个大学练习,课堂上说过程a(家长)会丢失一些信号,所以我们被告知只要求一定比例的孩子成功接收到信号 我想达到100%。另一种情况是暂停()和循环开始工作?如果使用标准的signal

进程A分叉表示4个子进程。exec()用于替换子级的代码。子项初始化,并且必须等待父项创建所有4个子项

然后父进程向每个子进程发送一个sigusr1,以便它们开始处理。父进程等待所有子进程完成。孩子完成工作后,会向家长发送一个sigusr2。当父进程接收到所有sigusr2信号时,它将继续执行,合并子进程的计算

这是一个大学练习,课堂上说过程a(家长)会丢失一些信号,所以我们被告知只要求一定比例的孩子成功接收到信号


我想达到100%。另一种情况是暂停()和循环开始工作?

如果使用标准的
signal()
方法,如果许多孩子在很短的时间内向进程a发送相同的信号,进程a可能会丢失一些信号。如果您正在处理一个信号,并且在此期间接收到同一个信号,那么您将丢失第二个信号(更准确地说,它将被默认的信号处理程序捕获)


如果您决定使用,您将能够捕获发送到进程的所有信号。

您必须使用
sigaction();但是,您可能会再次失去其中一些,因为:

信号不排队。子进程发送
SIGUSR2
,如果它们同时发生,则只传递其中一个进程。


最好的方法是使用
sigqueue()

使用实时信号。其他回答者已经介绍了如何避免信号丢失,也就是说,我建议根本不要使用信号。由于信号可以在任何点(即使在锁被持有的情况下)中断,因此很难编写比将标志写入fifo或增加eventfd更复杂的信号安全代码


因此,为什么不使用or来报告完成情况?这不仅保证了所有写入的消息都会发送到父进程,但也可以通过允许您的进程仅在准备就绪时从管道/eventfd接收数据来避免同步问题。

您将在父进程中使用信号alrm和pause,等待子进程生成警报信号,该警报信号将破解pause语句并同步它们

比那更复杂。。。您必须(a)使用
sigaction
,(b)提供sau SIGINFO标志;和(c)使用
sigqueue
发送信号。在中搜索“队列”。