如何可靠地找到某个进程是由于自己的不当行为接收到信号还是由另一个进程发送的信号?基本上,如何确定si_pid字段是否有效。Linux:信号源
回答
如果siginfo_t
结构中的si_pid
匹配getpid()
,则该过程以信号通知自身。否则,另一个过程做到了。由于进程ID在任何时间点都是唯一的,所以你现在拥有的PID不可能在你有PID的时候向你发送信号(因为那时它会显示自己而不是你)。
编辑:
正如你已经发现,在si_pid
领域并非总是设置;有时它包含垃圾值。首先要检查的是,在注册您的处理程序时,您在struct sigaction
的sa_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_signo
是SIGCHLD
。
This似乎并不正确。当进程由于其自身的不良行为而接收到信号时,它没有有效的si_pid。 Michael Kerrisk的书说,当信号由kill或sigqueue发送时,si_pid被设置。我测试了它,并且我观察到,当我的进程行为不当(通过引发SIGSEGV)时,si_pid与进程的PID不匹配。无论如何,感谢您的回应。 – gandalf 2014-09-22 14:48:26
- 1. Linux C信号
- 2. Sigalrm(linux信号)
- 3. Linux/vxworks信号
- 4. UNIX/Linux信号
- 5. Linux信号量:自旋锁或信号?
- 6. 信号+叉在linux
- 7. Linux中的信号
- 8. 在Linux计数信号量?
- 9. Erlang Linux信号处理
- 10. C Linux信号处理
- 11. linux中的信号强度
- 12. 误差信号在linux
- 13. UNIX/Linux信号处理:SIGEV_THREAD
- 14. 在linux中捕获信号
- 15. 与信号在Linux中
- 16. Linux和实时信号
- 17. linux设备资源号?
- 18. 跟踪UNIX信号源?
- 19. 有关linux信号的一些问题
- 20. 在linux中杀死和信号问题
- 21. linux c程序中的信号
- 22. SIGINT信号在linux中重新安装
- 23. Linux中是否挂起\ resume信号?
- 24. 在Linux和Windows下实现信号?
- 25. 通过PIPE发送Unix/Linux信号
- 26. 等待队列VS信号量在linux
- 27. Linux进程间可重入信号量
- 28. 如何在linux中发信号线?
- 29. 使用linux上的信号的IPC
- 30. Linux的蓝牙信号强度l2ping
你为什么问?你为什么在乎?你在想什么信号?你读过[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html)吗?你的应用程序在做什么?一个积极的内核黑客可以修补内核,添加一些东西发送一个真正的信号(你的应用程序无法识别为外部发送)... – 2014-09-22 16:31:07
相关:http://stackoverflow.com/a/17368232/132382 – pilcrow 2014-09-22 16:39:04