2014-09-22 43 views
0

如何可靠地找到某个进程是由于自己的不当行为接收到信号还是由另一个进程发送的信号?基本上,如何确定si_pid字段是否有效。Linux:信号源

+0

你为什么问?你为什么在乎?你在想什么信号?你读过[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html)吗?你的应用程序在做什么?一个积极的内核黑客可以修补内核,添加一些东西发送一个真正的信号(你的应用程序无法识别为外部发送)... – 2014-09-22 16:31:07

+1

相关:http://stackoverflow.com/a/17368232/132382 – pilcrow 2014-09-22 16:39:04

回答

2

如果siginfo_t结构中的si_pid匹配getpid(),则该过程以信号通知自身。否则,另一个过程做到了。由于进程ID在任何时间点都是唯一的,所以你现在拥有的PID不可能在你有PID的时候向你发送信号(因为那时它会显示自己而不是你)。

编辑:

正如你已经发现,在si_pid领域并非总是设置;有时它包含垃圾值。首先要检查的是,在注册您的处理程序时,您在struct sigactionsa_flags字段中通过了SA_SIGINFO。如果没有这个,你的处理程序可能根本没有收到siginfo_t

一旦这样做了,有些时候si_pid设置为规则,描述如下:https://www.mkssoftware.com/docs/man5/siginfo_t.5.asp#Signal_Codes

简单:si_pid应设置如果si_code是一个:

  • SI_USER - 包括对kill()电话
  • SI_QUEUE
  • SI_TIMER
  • SI_ASYNCIO
  • SI_MESGQ

它还可设置每当si_signoSIGCHLD

+0

This似乎并不正确。当进程由于其自身的不良行为而接收到信号时,它没有有效的si_pid。 Michael Kerrisk的书说,当信号由kill或sigqueue发送时,si_pid被设置。我测试了它,并且我观察到,当我的进程行为不当(通过引发SIGSEGV)时,si_pid与进程的PID不匹配。无论如何,感谢您的回应。 – gandalf 2014-09-22 14:48:26