當fork啟動乙個子程序之後,有時,我們想知道子程序何時結束,因此,我們可以通過呼叫wait()函式讓父程序等待子程序的結束。
函式原型為
#include
#include
pid_t wait
(int
* stat_loc)
;
wait系統呼叫將暫停父程序直到它的子程序結束為止。此呼叫返回的時子程序的pid,通常是已經結束的子程序的pid。狀態資訊允許父程序了解子程序的退出狀態,即子程序main函式返回的值或exit函式的退出碼。如果stat_loc不是空指標的話,狀態資訊將被寫入它所指向的位置,我們可以用sys/wait.**件中定義的巨集來解釋狀態資訊,如下圖示:
);//退出碼設定為3
}父程序用wait系統呼叫將自己的執行掛起,直到子程序的狀態資訊出現為止,這將發生在子程序呼叫exit的時候。我們將退出碼設定為3。父程序然後繼續執行,通過測試wait呼叫的返回值來判斷子程序是否終止。如果是,就從狀態資訊中提取出子程序的退出碼。
用fork來建立程序確實很實用,但你必須清楚子程序的執行狀況,子程序中終止時,與父程序的關聯還保持,直到父程序正常終止或父程序呼叫wait才告結束。因此,程序表中代表子程序的表項不會立即釋放,雖然子程序已經結束,但他仍然存在於系統中,因為他的退出碼還需要儲存起來,以備父程序呼叫wait使用。而這時他將會成為乙個死程序/殭屍程序。
簡單地說就是:子程序先於父程序結束,父程序沒有呼叫wait獲取子程序的退出碼,子程序變成僵死程序
解決方案:
**實現為上面的**。
還有乙個系統呼叫是用來等待子程序的結束,是waitpid()函式。
函式原型為
#include
#include
pid_t waitpid
(pid_t pid,
int* stat_loc,
int option)
;
pid指定的是需要等待的子程序的pid,如果stat_loc不是空指標的話,狀態資訊將被寫入它所指向的位置,option引數用來改變waitpid的行為,其中最常用的是wnohang,它的作用是防止waitpid呼叫將呼叫者的執行掛起。
因此,如果想讓父程序週期性的檢查某個特定的子程序是否已終止,可以使用如下呼叫方式;
waitpid
(child_pid,
(int)*
0, wnohang)
;
如果子程序沒有結束或意外終止,它就返回0,否則返回child_pid。如果waitpid失敗,將返回-1並設定error。
exec函式可以把當前程序替換為乙個新程序,新程序由path或file引數指定。可以使用exec函式將程式的執行從乙個程式切換到另乙個程式
詳細介紹請看這個部落格替換程序映像exec系列函式,寫的挺不錯的。
此處內容日後有機會再補充。。。
Linux 殭屍程序與孤兒程序
之前的部落格有講過儲存程序資訊的乙個重要的資料結構,task struct結構體,其中,state表示程序可能出現的狀態。如下 static const char const task state array 我們對個別狀態進行解釋如下 s sleeping 淺度睡眠,也是不可中斷睡眠。d disk...
Linux 殭屍程序與孤兒程序
產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍程序,在第...
Linux 殭屍程序與孤兒程序
殭屍程序 產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍...