程序控制之exit和waitpid wait 函式

2021-04-25 01:54:29 字數 2638 閱讀 1337

1. exit函式

我們知道,程序有五種正常終止:

1). 從main函式執行return語句,如同呼叫exit一樣。

2). 呼叫exit。此函式有iso c定義,其操作包括呼叫各中終止處理程式,然後關閉所有標準i/o流等。因為iso c並不處理檔案描述符,多程序以及作業控制,所以這一定義對unix系統是不完整的。

3). 呼叫_exit或_exit。iso c定義_exit,其目的是為程序提高一種無需執行終止處理程式或訊號處理程式而終止的方法。在unix系統中,_exit或_exit是同義的,並不沖洗標準i/o流。_exit由exit呼叫。

4). 程序的最後乙個執行緒在啟動例程中執行返回語句。但是,該執行緒的返回值不會用作程序的返回值。而該程序以終止狀態0返回。

5). 最後乙個執行緒呼叫pthead_exit,而該程序以終止狀態0返回。

三種異常終止

1). 呼叫abort

2). 接到乙個訊號並終止

3). 最後乙個執行緒對取消請求做出響應。

不管程序如何終止,最後都會執行核心同一段**。這段**為相應程序關閉所有開啟描述符,釋放它使用的儲存器等。

在任意一種情況下,終止程序的父程序都能用wait或waitpid函式取得其終止狀態。在最後呼叫_exit時,核心將退出狀態轉換為終止狀態(termination status)。

如果父程序在子程序前終止,將如何?對於父程序已經終止的所有程序,它們的父程序都改變為init程序。我們稱這些程序由init領養。在乙個程序終止時,核心逐個堅持所有活動程序,以判斷它是否是正要終止程序的子程序,如果是,則將該程序的父程序id改為1。只要init的子程序終止,init會呼叫乙個wait函式獲得其終止狀態。

如果子程序在父程序之前終止,將如何?核心為每個終止子程序儲存了一定量的資訊,所以當終止程序的父程序呼叫wait或waitpid函式時,可以得到這些資訊。在uinx術語中,乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被稱為僵死程序(zombie)。ps命令將僵死程序的狀態列印為z。

2. wait和waitpid函式

當乙個程序正常或異常終止時,核心就向其父程序傳送sigchld訊號。父程序可以忽略該訊號,或呼叫訊號處理函式。呼叫wait或waitpid的程序,會發生以下情況:

1). 如果其所有子程序都在執行,則該程序阻塞

2). 如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則取得該程序的終止狀態立即返回

3). 如果它沒有任何子程序,則立即出錯返回。

#include

#pid_t wait (int * statloc);

#pid_t waitpid (pid_t pid, int * statloc, int optins);

2.1. wait和waitpid函式區別

區別如下

1). 在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞。

2). waitpid並不等待在其呼叫之後的第乙個終止子程序,它有若干個選項,可以控制它所等到的程序。

3). 對於wait,其唯一的出錯是呼叫程序沒有子程序;對於waitpid,入股指定的程序或程序組不存在,或者引數pid指定的程序不是呼叫程序的子程序都可能出錯。

4). waitpid提供了wait沒有的三個功能:一是waitpid可等待乙個特定的程序;二是waitpid提供了乙個waitpid的非阻塞版本;三是waitpid支援作業控制。  

依據傳統,這兩個函式返回的整型狀態字是由實現定義的。其中某些位表示退出狀態(正常返回),其它位表示訊號編號(異常返回)。下表有四個互斥的巨集。

wifexited(status)

若為正常終止子程序返回的狀態,則為真。對於這種情況可以執行wexitstatus(status),取子程序傳送給exit、_exit或_exit引數的低8位。

wifsignaled(status)

若為異常終止子程序返回的狀態,則為真(接到乙個不捕捉的訊號)。對於這種情況可以執行wtermsig(status),取得子程序終止的訊號編號。

wifstopped(status)

若為當前暫停子程序返回的狀態,則為真。對於這種情況可以執行wstopsig(status),取得子程序暫停的訊號編號。

wifcontinued(status)

若在作業控制暫停後已經繼續的子程序返回的狀態,則為真。僅用於waitpid。

對於waitpid函式中的pid引數的作用見下表:

pid == -1

等待任一子程序。

pid > 0

等待其程序id與pid相等的子程序

pid == 0

等待其組id等於呼叫程序組id的任一的子程序

pid < -1

等待其組id等於pid絕對值的任一的子程序

對於waitpid函式中的options引數的作用見下表:

wcontinued

若實現支援作業控制,那麼由pid指定的任一子程序在暫停後已經繼續,但是狀態沒報告,則返回其狀態

wnohang

若由pid指定的子程序並不是立即可用的,則waitpid不阻塞,此時返回值為0

wuntraced

若實現支援作業控制,那麼由pid指定的任一子程序已經處於暫停狀態並沒報告過,則返回其狀態

2.2. fork兩次可以避免僵死程序

例項如下:

程序控制之exit函式

程序有下面5種正常終止方式 1 在main函式內執行return語句。這等效於呼叫exit。2 呼叫exit函式。此函式有iso c定義,其操作包括呼叫各終止處理程式 終止處理程式在呼叫atexit函式時登記 然後關閉所有標準i o流等。3 呼叫 exit或 exit函式。iso c定義 exit,...

程序退出 exit 和 exit

void exit int value 是標準庫函式,在標頭檔案 stdlib.h 中定義。具有重新整理 i o 緩衝區的作用。他的引數 value 是返回給父程序的資料 低 8 位有效 void exit int value 是系統呼叫函式,在標頭檔案 unistd.h 中定義。沒有重新整理 i ...

程序控制之wait和waitpid函式

當乙個程序正常或異常終止時,核心就向其父程序傳送sigchld訊號。因為子程序終止是個非同步事件 這可以在父程序執行的任何時候發生 所以這種訊號也是核心向父程序發的非同步通知。父程序可以選擇忽略該訊號,或者提供乙個該訊號發生時即被呼叫執行的函式 訊號處理程式 對於這種訊號的系統預設動作是忽略它 呼叫...