如何可靠地找到某個進程是由於自己的不當行爲接收到信號還是由另一個進程發送的信號?基本上,如何確定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. Linux/vxworks信號
- 3. UNIX/Linux信號
- 4. Sigalrm(linux信號)
- 5. 信號+叉在linux
- 6. 在Linux計數信號量?
- 7. Erlang Linux信號處理
- 8. Linux和實時信號
- 9. 誤差信號在linux
- 10. UNIX/Linux信號處理:SIGEV_THREAD
- 11. 與信號在Linux中
- 12. 跟蹤UNIX信號源?
- 13. 進程之間的信號查詢Linux
- 14. Linux:信號對多線程的影響
- 15. 有關linux信號的一些問題
- 16. 如何在linux中發信號線?
- 17. Linux中是否掛起\ resume信號?
- 18. 如何截取linux信號? (在C)
- 19. 檢測信號的發送者(linux,ptrace)
- 20. Linux進程間可重入信號量
- 21. 推遲在Linux中的信號處理
- 22. Linux的藍牙信號強度l2ping
- 23. Linux阻止信號到Python初始化
- 24. 信號如何在linux(c)上工作?
- 25. Linux:忽略信號處理程序中的信號,忽略所有這些連續的信號
- 26. Linux中POSIX可靠信號與POSIX實時信號有什麼區別?
- 27. 如何確定unix信號隊列中待處理的信號的數量(Linux)
- 28. R電源與信號強度代碼
- 29. 切換信號源已經結束
- 30. 區分PySide中的信號源
你爲什麼問?你爲什麼在乎?你在想什麼信號?你讀過[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