Linux下什麼是程序等待?為什麼程序需要等待?

2021-08-29 04:40:36 字數 1643 閱讀 3542

當乙個程序建立了新的程序時,父程序(原程序)往往需要讀取子程序(新程序)的執行結果。如果子程序先於父程序退出,而父程序不能及時讀取子程序的退出狀態的話,子程序便會一直存在,此時子程序便會變成殭屍狀態。久而久之,便會造成記憶體洩漏!

那麼為了避免記憶體洩漏,我們可以通過kill指令銷毀掉父程序,那麼殭屍程序便也會隨之銷毀。但是這樣做只是治標不治本,我們應該從根源上來處理,那就是應該避免產生殭屍程序,即讓父程序及時地讀取子程序的退出狀態》程序等待!!!

此時又會引入兩個概念:阻塞和非阻塞

阻塞:為了完成乙個功能發起一次函式呼叫,如果沒有完成這個功能則一直等待,直到功能完成才返回。舉個例子,就像去飯店吃飯一樣,當你很想吃某種食物的時候,即使你前邊還有很多人排隊買飯,你也會一直等,直到最後吃到自己喜歡的食物。

非阻塞:為了完成乙個功能發起一次函式呼叫,如果現在不具備該功能完成的條件,則不等待立即返回。它就像是你打算去飯店吃飯,結果看到那個飯店人特別多,然後你轉身就走了一樣,最後的結果是你並沒有吃到那家飯店的飯。

在linux中,有兩種等待函式:

pid_t wait(int *status);    //阻塞式等待
上面提到過阻塞和非阻塞,那麼wait()函式便是阻塞式等待函式。

功能:等待任意子程序退出,如果沒有子程序退出就一直等待。其中的引數status即是獲取子程序的退出狀態,如果不關心,則置為null。

返回值:成功返回被等待子程序的pid,失敗返回-1

//可以設定成阻塞式等待,也可以是非阻塞式等待

pid_t waitpid(pid_t pid,int *status,int opitions);

waitpid()函式的功能:可以等待指定的子程序退出,也可以等待任意子程序退出。

可以看到該函式有3個引數:pid、status、opitions

pid:-1      等待任意子程序退出;

>0    等待程序id=pid的子程序退出

status:獲取子程序的退出狀態

wifexited(status);     // 子程序**執行完畢正常退出

wexitstatus(status); //如果wifexited非零,讀取子程序的退出碼

wifsignaled(status); //異常訊號導致退出

wtermsig(status); //如果wifsignaled非零,返回異常訊號

opitions:選項引數

wnohang:如果沒有子程序退出則立即報錯返回0,不等待;如果有則**資源

當pid取-1,opitions預設取0時,此時就等同於wait()函式,即阻塞等待任意子程序退出。

返回值:如果子程序正常退出,則返回子程序的pid;

如果設定了選項wnohang,且此時沒有子程序退出則返回0;

如果呼叫出錯,則返回-1

關於子程序的退出碼獲取:status中儲存了子程序的退出原因及退出碼,雖然該引數用了4個位元組來獲取,但實際上只用了低16的兩個位元組來儲存,其中高8位用來儲存子程序的退出碼,低8位用來儲存子程序異常退出的訊號值。   當子程序正常退出時,其退出碼可用 status>>8 & 0xff 來獲取,此時低8位為0;當子程序異常退出時,可用 status & 0x7f 來獲取使程序異常退出的訊號值,此時高8位為0。

Linux下的程序概念,程序狀態和程序等待

程序就是乙個pcb process control block 是作業系統對執行中程式的描述,通過這個描述實現對執行中程式的排程管理,linux下pcb是乙個task struct結構體,task struct是linux核心的一種資料結構。task struct結構體中的內容 包括記憶體指標,上下...

linux下的C語言開發(程序等待)

所謂程序等待,其實很簡單。前面我們說過可以用fork建立子程序,那麼這裡我們就可以使用wait函式讓父程序等待子程序執行結束後才開始執行。注意,為了證明父程序確實是等待子程序執行結束後才繼續執行的,我們使用了sleep函式。但是,在linux下面,sleep函式的引數是秒,而windows下面sle...

linux下的C語言開發(程序等待)

所謂程序等待,其實很簡單。前面我們說過可以用fork建立子程序,那麼這裡我們就可以使用wait函式讓父程序等待子程序執行結束後才開始執行。注意,為了證明父程序確實是等待子程序執行結束後才繼續執行的,我們使用了sleep函式。但是,在linux下面,sleep函式的引數是秒,而windows下面sle...