繁体   English   中英

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

[英]Interprocess synchronization using signals in c, linux

进程 A 分叉说 4 个子进程。 exec() 用于替换子代的代码。 孩子们初始化并且必须等待父母创建所有 4 个。

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

这是一个大学练习,在 class 中指出进程 A(父进程)会丢失一些信号,因此我们被告知只需要成功接收一定百分比的子进程信号。

我想达到100%。 在另一种情况下,暂停()和循环会起作用吗?

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

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

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

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

最好的方法是使用sigqueue()使用实时信号。

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

因此,为什么不直接使用pipeeventfd来报告完成? 这不仅保证写入的所有消息都将发送到父进程,而且还通过允许您的进程仅在管道/eventfd 准备好时才从管道/eventfd 接收数据来避免同步问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM