Linux:信号源

时间:2014-09-22 14:29:15

标签: linux signals

如何可靠地发现进程是否由于其自身的不当行为而接收到信号,或者是否由另一个进程发送了相同的信号?基本上,如何确定si_pid字段是否有效。

1 个答案:

答案 0 :(得分:2)

如果si_pid结构中的siginfo_tgetpid()匹配,则该过程会自行发出信号。否则,另一个过程。由于进程ID在任何时间点都是唯一的,因此您现在拥有的PID可能无法在您拥有PID时向您发送信号(因为那时它会发出信号,而不是您自己)。

编辑:

正如您所发现的,si_pid字段并不总是设置;有时它包含垃圾值。首先要检查的是,在注册处理程序时,您已在SA_SIGINFO的{​​{1}}字段中通过了sa_flags。如果没有这个,您的处理程序可能根本不会收到struct sigaction

完成后,有siginfo_t设置时间的规则,如下所述:https://www.mkssoftware.com/docs/man5/siginfo_t.5.asp#Signal_Codes

简而言之:如果si_pid是以下之一,则应设置si_pid

  • si_code - 包括对SI_USER
  • 的调用
  • kill()
  • SI_QUEUE
  • SI_TIMER
  • SI_ASYNCIO

只要SI_MESGQsi_signo,就会设置它。