如何可靠地找到某個進程是由於自己的不當行爲接收到信號還是由另一個進程發送的信號?基本上,如何確定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