【问题标题】:Is there any way to be notified when another process receives a signal?当另一个进程收到信号时,有什么方法可以通知?
【发布时间】:2017-11-10 13:47:17
【问题描述】:

我知道进程如何响应专门发送给它的信号(例如SIGINTSIGTERMSIGUSR2 等)。但是,是否可以将发送到不同进程的信号通知进程?

【问题讨论】:

  • 你为什么要问?请编辑您的问题以激发它。闻起来有点像XY problem
  • 我不喜欢最近对 XY 问题的关注。与您在下面非常有用的答案不同,许多 SO 用户很快就驳回了 OP 的问题,而是直接得出 OP 没有任何线索的结论。当然,有时 OP 问题中的额外动机可以澄清事情,但这需要与简短、简洁和清晰的问题的优点相平衡。这个问题简短而清晰,您的答案切题且写得很好。未来的读者将立即了解今天在这里写的内容,以及它是否适用于他们的情况。
  • 我确信您心中还有一些其他目标(或动机)。你肯定已经读过signal(7)。在一个句子(或其中几个)中提及它们会很多你的问题(恕我直言太短了)。 你为什么这么问?
  • 例如,许多涉及 Python 中的多线程的问题很快就会收到类似“不要在 Python 中使用线程......因为 GIL”这样的回复。在许多情况下,这些答案是无用的并且实际上是不正确的。 (大多数数值处理库都发布了 GIL,因此线程是实现并行化的最有效方式。)当响应者处于“你不知道自己在做什么,请改用多处理”的答案时,这真是令人沮丧。无知的人!
  • 但这并不能改善您的问题。上面的评论应该去元,根本与你的问题无关。我希望您避免评论自己的问题(因为您在这里已经有 6K 分,所以您知道这里的习惯)

标签: unix signals


【解决方案1】:

在标准 Unix 或 POSIX 中,您无法收到发送到另一个进程的信号的通知。请参阅signal(7)signal-safety(7)

但是,waitpid(2) 和朋友可以告诉您child process 是否已因信号终止。并且killpg(2)process group 发送信号(kill(2) 也使用负目标 pid 执行此操作)。并且getrusage(2) 可以计算信号(由其他进程接收)。您还可以使用proc(5) 来查询有关其他进程的信息。您可能会使用signalfd(2)ptrace(2) 等......

信号是inter-process communication 的一种非常有限且糟糕的形式。还有更好的方法。

顺便说一句,sigaction(2) 可以与 SA_SIGINFO 一起使用,然后您的处理程序会获得一个指向 siginfo_t 的指针和另一个指向 ucontext_t 的指针,因此您可以获得很多信息。

请注意,进程组和会话是相关的。另请参阅setpgid(2)setsid(2)credentials(7) 以及与终端和伪 ttys 相关的内容(阅读tty demystified 和关于job control)。

我猜你的other 问题是关于这些的。但是你在那里没有提到他们中的任何一个。

【讨论】:

  • 非常感谢您的全面回答,这是非常有用的信息。
  • 你能改进你的问题来激发它吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2020-02-27
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多