【问题标题】:Interprocess synchronization using signals in c, linux在c,linux中使用信号进行进程间同步
【发布时间】:2011-09-06 05:05:55
【问题描述】:

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

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

这是一个大学练习,课堂上说过进程 A(父进程)会丢失一些信号,所以我们被告知只需要成功接收一定百分比的子进程信号。

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

【问题讨论】:

    标签: c linux process synchronization signals


    【解决方案1】:

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

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

    【讨论】:

    • 比这更复杂...你必须 (a) 使用 sigaction,(b) 提供 SA_SIGINFO 标志; (c) 使用sigqueue 发送信号。在sigaction POSIX reference中搜索“队列”。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2023-01-29
          • 2015-05-06
          • 2015-04-13
          • 1970-01-01
          • 1970-01-01
          • 2021-04-25
          • 2016-07-31
          • 1970-01-01
          相关资源
          最近更新 更多