【问题标题】:Signal all processes in process group except self向进程组中除自身以外的所有进程发出信号
【发布时间】:2018-10-23 07:48:29
【问题描述】:

我正在编写一个多个进程将同时运行的程序。在这个程序中,需要一个进程来临时暂停所有其他参与者。

为了省去在共享页面中列出所有参与者进程 ID 并单独发出信号的开销,我创建了一个所有参与者都加入的进程组。

为了暂停一个组中的所有进程,我最初使用了调用:

killpg(0, SIGSTOP);

并打算通过以下方式恢复它们:

killpg(0, SIGCONT);

不过,我很快意识到,这也会暂停调用进程,只要它也是进程组的成员。因为任何进程都应该能够挂起组中的其他成员,所以我不能将一个进程专门用于此任务。因此,我的问题是,是否存在系统调用或机制来暂停除调用者之外的所有组成员。我正在寻找专门用于 Linux 的东西。

【问题讨论】:

  • 你无法捕捉到 SIGSTOP,但你可以捕捉到 SIGTSTP——所以发送 SIGTSTP 但在发送者中暂时忽略它。
  • @WilliamPursell 您是否建议我为所有进程安装处理程序,然后尝试推断我应该暂停执行还是继续执行?是否有一种快速的方法可以在没有处理程序的情况下暂时禁用信号?
  • 不需要处理程序。 SIGSTSP 的默认处置与 SIGSTOP 相同。只需忽略发送方中的信号,然后发送,然后恢复默认配置。 man sigignore
  • @WilliamPursell:为什么不把这个作为答案。
  • @alk 因为它没有回答如何向除一个之外的所有组成员发送信号的问题。这个问题的答案(我相信)是“你不能”。

标签: c linux signals ipc


【解决方案1】:

您不能向除发送者之外的所有组成员发送信号,但有一个合理的解决方法。除了使用SIGSTOP(无法处理或忽略),您可以使用SIGTSTP,默认情况下与SIGSTOP具有相同的效果,停止接收它的进程。为了避免停止发送者,只需让发送者在发送信号之前忽略它,然后在向进程组发送信号后将信号处理重置为默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多