奇怪的殭屍程序響應信號?
我有一個奇怪的情況。
我有一個 c 編寫的程序“A”,它以其他執行檔的名稱作為參數,例如“B”、“C”、“D”等。“A”的主要工作是分叉並啟動“B” ,“C”等,然後檢查它們是否崩潰,在這種情況下重新啟動崩潰的程序。
此外,程序“A”執行一個單獨的執行緒用於 RTC 同步目的。“A”以 開頭
/bin/sh -c A B C D etc
。我在嵌入式環境中,我使用的是從 Linux 4.4.57 派生的定制核心。
現在問題來了:有時我的程序“A”會變成殭屍!
我做了一些觀察:
- 啟動“A”的父程序
/bin/sh -c
仍然存在;- 沒有一個子程序“B”、“C”等是死的;
- “A”響應信號;
- 如果我殺死父程序
/bin/sh -c
,“A”的父程序將變為 init (1),但該程序仍然是殭屍程序;- 殺死殭屍“A”的唯一方法是發出一個
kill -9 «pid-of-A»
;- RTC 同步執行緒仍在執行!;
現在,由於“A”響應信號並且內部執行緒仍在執行,這個殭屍程序快把我逼瘋了。
什麼解釋了這種行為?可能與核心建構配置有關嗎?
編輯:我更好地查看了程式碼,發現“A”是使用以下命令作為守護程序啟動的:
start-stop-daemon -b --start --quiet --pidfile /var/run/A.pid --background --exec /bin/sh -- -c "A B C D > /var/log/log 2>&1"
更新:我已經能夠通過呼叫 pthread_exit() 來複製相同的行為。問題是我在原始來源上找不到任何對 pread_exit 的引用。主執行緒是否有任何其他方式可能會停止讓所有其他執行緒保持活力?
殭屍程序是一個已經完成的程序,但在程序表中仍有一個條目,因為例如它的子程序還活著(參見Wikipedia)。
因此,如您所說,如果 B、C 和 D 都沒有死,並且 A 完成執行,它將成為殭屍,直到所有 B、C 和 D 也完成執行。
這是正常行為。
所以這看起來像 A 中的一個錯誤:它不應該在它的孩子還活著的時候死去,因為它應該監視孩子。修復A中的Bug,不用擔心它會變成殭屍。
如果您
pthread_exit()
在main()
函式中使用,則此 SO 文章建議主執行緒可能進入殭屍狀態,但其他執行緒繼續執行。由於召喚pthread_exit()
是main()
完全合法的,我想這是一種正常的事態,這種特殊的不死生物是無害的。你可以忽略它,或者等待其他執行緒main()
而不是在pthread_exit()
那裡使用。