如何可靠地发现进程是否由于其自身的不当行为而接收到信号,或者是否由另一个进程发送了相同的信号?基本上,如何确定si_pid字段是否有效。
答案 0 :(得分:2)
如果si_pid
结构中的siginfo_t
与getpid()
匹配,则该过程会自行发出信号。否则,另一个过程。由于进程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_MESGQ
为si_signo
,就会设置它。