名稱
等待,waitpid - 等待進程終止
概要
#include
#include
pid_t wait(int * status );
pid_t waitpid(pid_t pid ,int * status ,int options );
描述
等待函數暫停當前進程的執行,直到孩子退出,或者直到一個信號被傳遞,其行動是終止當前進程或調用信號處理函數。 如果一個孩子在通話結束時已經退出(所謂的“殭屍”進程),該函數立即返回。 任何由孩子使用的系統資源都將被釋放。
waitpid函數暫停當前進程的執行,直到由pid參數指定的子進程退出,或者直到傳遞了一個信號,該信號的作用是終止當前進程或調用信號處理函數。 如果在pid請求的孩子已經退出通話時(所謂的“殭屍”進程),該函數立即返回。 任何由孩子使用的系統資源都將被釋放。
pid的值可以是下列之一:
<-1
意味著等待進程組ID等於pid絕對值的任何子進程。
-1
這意味著等待任何兒童進程; 這是等待展品的行為。
0
這意味著等待進程組ID等於調用進程的任何子進程。
> 0
這意味著等待進程ID等於pid值的子進程。
選項的值是零個或多個以下常量的或:
WNOHANG
這意味著如果沒有孩子退出就立即返回。
WUNTRACED
這意味著還要為已停止的兒童返回,而且其狀態尚未報告。
(僅適用於Linux,請參閱下文。)
如果狀態不為NULL ,則在狀態指向的位置等待或waitpid存儲狀態信息。
這個狀態可以用下面的宏來評估(這些宏將stat緩衝區(一個int )作為參數---不是指向緩衝區的指針!):
WIFEXITED( 狀態 )
如果孩子正常退出,則不為零。
WEXITSTATUS( 狀態 )
評估為終止的子代碼的最低有效位8位,它可能已被設置為對exit()的調用的參數或者作為主程序中的返回語句的參數。 只有在WIFEXITED返回非零值時才能評估此宏。
WIFSIGNALED( 狀態 )
如果子進程由於未捕獲到的信號而退出,則返回true。
WTERMSIG( 狀態 )
返回導致子進程終止的信號的編號。 只有在WIFSIGNALED返回非零值時才能評估此宏。
WIFSTOPPED( 狀態 )
如果導致返回的子進程當前停止,則返回true; 這只有在使用WUNTRACED完成呼叫時才有可能。
WSTOPSIG( 狀態 )
返回導致孩子停止的信號的數量。 只有在WIFSTOPPED返回非零值時才能評估此宏。
一些版本的Unix(例如Linux,Solaris,但不是AIX,SunOS)也定義了一個宏WCOREDUMP( status )來測試子進程是否轉儲核心。 只能在#ifdef WCOREDUMP ... #endif中使用。
返回值
退出的子進程ID,如果使用WNOHANG且沒有可用的子進程,則為零,或者錯誤時為-1(在這種情況下,將errno設置為適當的值)。
錯誤
ECHILD
如果過程中指定 pid不存在或不是調用進程的子進程。 (如果將SIGCHLD的操作設置為SIG_IGN,則可能發生在自己的孩子身上,另請參閱關於線程的LINUX NOTES部分。)
EINVAL
如果選項參數無效。
EINTR
如果沒有設置WNOHANG ,並且未捕獲信號或SIGCHLD被捕獲。