linux高編之wait和waitpid函式

2021-06-18 11:44:35 字數 2037 閱讀 1984

乙個程序在終止時會關閉所有檔案描述符,釋放在使用者空間分配的記憶體,但它的pcb還保留著,核心在其中儲存了一些資訊:如果是正常終止則儲存著退出狀態,如果是異常終止則儲存著導致該程序終止的訊號是哪個。這個程序的父程序可以呼叫wait或waitpid獲取這些資訊,然後徹底清除掉這個程序。我們知道乙個程序的退出狀態可以在shell中用特殊變數$?檢視,因為shell是它的父程序,當它終止時shell呼叫wait或waitpid得到它的退出狀態同時徹底清除掉這個程序。所以wait的作用是清楚程序並得到他的退出狀態。

如果乙個程序已經終止,但是它的父程序尚未呼叫wait或waitpid對它進行清理,這時的程序狀態稱為殭屍(zombie)程序。

如果乙個父程序終止,而它的子程序還存在(這些子程序或者仍在執行,或者已經是殭屍程序了),則這些子程序的父程序改為init程序。這個程序就稱為孤兒程序。

wait和waitpid的原型為

pid_t wait(int *status);

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

pidpid>0,等待其程序id等於pid的子程序退出;pid=0,等待其組id等於呼叫程序的組id的任一子程序;pid

引數 option 可以為 0 或下面的 or 組合:

wnohang 如果沒有任何已經結束的子程序則馬上返回, 不予以等待。

wuntraced 如果子程序進入暫停執**況則馬上返回,但結束狀態不予以理會。

status儲存程序的退出狀態。底下有幾個巨集可判別結束情況:

wifexited(status)如果子程序正常結束則為非 0 值。

wexitstatus(status)取得子程序 exit()返回的結束**,一般會先用 wifexited 來判斷是否正常結束才能使用此巨集。

wifsignaled(status)如果子程序是因為訊號而結束則此巨集值為真

wtermsig(status) 取得子程序因訊號而中止的訊號**,一般會先用 wifsignaled 來判斷後才使用此巨集。

wifstopped(status) 如果子程序處於暫停執**況則此巨集值為真。一般只有使用 wuntraced 時才會有此情況。

wstopsig(status) 取得引發子程序暫停的訊號**,一般會先用 wifstopped 來判斷後才使用此巨集。

這些巨集的定義如下(來自linux下的/usr/include/bits/waitstatus.h):

當wait呼叫成功則會返回清理掉的子程序id,出錯返回-1。

父程序呼叫wait或waitpid時可能會:

阻塞(如果它的所有子程序都還在執行)。

帶子程序的終止資訊立即返回(如果乙個子程序已終止,正等待父程序讀取其終止資訊)。

出錯立即返回(如果它沒有任何子程序)。

這兩個函式的區別是:如果父程序的所有子程序都還在執行,呼叫wait將使父程序阻塞,而呼叫waitpid時如果在options引數中指定wnohang可以使父程序不阻塞而立即返回0。wait等待第乙個終止的子程序,而waitpid可以通過pid引數指定等待哪乙個子程序。

waitpid函式舉例:

#include #include #include #include #include int main(void)

if(pid==0)

exit(3);

}else

return 0;

}

執行結果:

其中的3就是該程序的退出狀態exit(3),

子程序的終止資訊在乙個int中包含了多個字段,用巨集定義可以取出其中的每個字段:如果子程序是正常終止的,wifexited取出的字段值非零,wexitstatus取出的字段值就是子程序的退出狀態;如果子程序是收到訊號而異常終止的,wifsignaled取出的字段值非零,wtermsig取出的字段值就是訊號的編號。

java高併發程式設計wait和 notify

wait和 notify必須配合synchronized使用 乙個執行緒修改乙個物件的值,而另乙個執行緒則感知到了變化,然後進行相應的操作,這就是wait notify 和notifyall 方法的本質。具體體現到方法上則是這樣的 乙個執行緒a呼叫了物件obj的wait方法進入到等待狀態,而另乙個執...

linux高編執行緒 執行緒同步 互斥量

執行緒同步 互斥量 某乙個資源可能在使用的過程中產生競爭和衝突。那麼互斥量解決同一時刻只有執行緒對資源進行操作。限制的是 功能 銷毀乙個互斥量 引數 mutex 型別為pthread mutex t型別的變數 返回值 成功返回0,失敗返回errno int pthread mutex destroy...

程序管理之wait和waitpid

在介紹wait waitpid和waitid函式之前,首先要介紹一下殭屍程序,因為,這三個函式的本質任務就是處理殭屍程序的問題。程序會我們的生命體一樣,也有消亡。程序在退出時,核心會清理程序幾乎所有的資源。例如 記憶體資源 檔案資源 訊號量資源 共享記憶體資源或者引用數減一 又或釋放共享記憶體資源。...