完整了解unix程序控制是十分重要的。
對我們而言,必須熟練掌握的幾個函式:fork,exec系列,_exit,wait和waitpid
waitpid可以等待乙個特定程序的結束
wait相當於: waitpid( -1, &status, 0 );
關於fork:
如果子程序在父程序之前終止,父程序可以通過wait或者waitpid獲得子程序的狀態,核心為每個終止子程序儲存了一定量的資訊
乙個已經終止,但是父程序沒有做善後處理的程序被稱為殭屍程序zombie,ps(1)列印的狀態為z。
如果編寫乙個長期執行的程式,它fork很多子程序,除非父程序等待取得子程序的終止狀態,不然這些子程序終止後就會變成zombie
由init (id為1,在自舉過程結束時呼叫,絕不會終止)收養的程序,它結束時,init一定會呼叫乙個wait函式取得終止狀態
所謂「乙個init的子程序」,指的可能是init直接產生的程序(比如getty);或者其父程序已經終止,由init收養的程序
子程序正常或者異常終止,核心向它的父程序傳送非同步sigchld訊號
對於sigchld系統預設是忽略
小技巧
如果乙個程序fork乙個子程序,但不要它等待子程序終止,也不希望子程序處於殭屍狀態直到父程序終止,可以fork兩次
fork兩次避免殭屍程序:
#include #include #include #define handle_error(msg) \
do while(0)
int main(void)
else
return exit_success;
}
第二個子程序呼叫sleep(3)保證列印父程序id的時候第乙個子程序已經終止。fork之後父程序和子程序都可以繼續執行,並且我們無法**哪乙個先執行。fork之後如果不讓第二個子程序休眠,那麼它可能比其父程序先執行,於是它列印的父程序id將是建立它的父程序的id而不是init程序的1.。
當原來的程序(exec本程式的程序)終止時,shell列印其提示符,這在第二個子程序列印其父程序id之前。
程序控制之fork函式
乙個現有程序可以呼叫fork函式建立乙個新程序。include pid t fork void 返回值 子程序中返回0,父程序中返回子程序id,出錯返回 1 由fork建立的新程序被稱為子程序 child process fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值是0,而...
Unix程序控制之1 fork和vfork函式
一 fork函式 乙個執行中的程序可以呼叫fork 函式來產生乙個新的程序,函式原型及標頭檔案定義如下 include pid t fork void returns 0 in child,process id of child in parent,1 on error 下面有幾個細節性問題來說明 ...
程序及程序控制
學習程序之前,先了解一下程式 所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu 記憶體.而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。linux下的...