2014-09-22 42 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