2009-02-18 44 views
1

我想測試我的系統,並希望模擬子進程掛起的情況。爲此,我正試圖將子進程附加到GDB並在其上放置一段時間。但事情似乎沒有像預期的那樣進行。掛一個子進程

此外,我如何知道產生的子進程沒有進展,但是被掛起?

回答

1

使用可以使用SIGSTOP來掛起一個子進程 - 但這與子進程進入無限循環或有條件的等待有明顯不同 - 仍然可能足夠接近進行測試。

要檢查子進程沒有掛起,你需要發送心跳給父母(你需要某種通信通道 - 至少stdin/stdout)。然後,如果孩子沒有發送一些心跳消息,那麼孩子已經掛了。

0

子進程將繼承在fork之前創建的任何管道。你可以用它來「懸掛」你的孩子並讓它知道什麼時候繼續。你可以讓你的子進程在管道上嘗試一個阻塞讀操作,它會阻塞(即掛起),直到父進程寫入內容爲止。

你也可以使用Douglass提到的信號。您可以讓操作系統進行基本的停止/繼續操作,或者您可以執行信號處理程序來執行更復雜的操作(如進入無限循環)。

對於這兩種

例子可以在Unix Programming FAQ一噸的過程控制,信號處理,管道等其他信息一起被發現...

你可以嘗試尋找在/ proc,以確定是否被掛起。您可以讀取/ proc/< child-pid >/stat以獲取大量低級別進程信息,包括當前狀態,進程已調度的用戶/內核時間量,當前堆棧和指令指針等。 ..使用這個組合,你可以嘗試確定過程是否掛起。查看proc(5)手冊頁獲得/ proc/<pid>/stat的更多信息。