一、wait和waitpid函數(shù)
當(dāng)一個進程正?;虍惓=K止時會向父進程發(fā)送SIGCHLD信號。對于這種信號系統(tǒng)默認會忽略。調(diào)用wait/waidpid的進程可能會:
阻塞(如果其子進程都還在運行);
立即返回子進程的終止狀態(tài)(如果一個子進程已經(jīng)終止正等待父進程存取其終止狀態(tài));
出錯立即返回(如果它沒有任何子進程);
如果進程由于收到SIGCHLD信號而調(diào)用wait,則可期望wait會立即返回。但是在任一時刻調(diào)用則進程可能阻塞。
#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *statloc);pid_t waitpid(pid_t pid, int *statloc, int options); 返回值: 成功返回進程ID, 出錯-1.
這兩個函數(shù)區(qū)別:
wait如果在子進程終止前調(diào)用則會阻塞,而waitpid有一選項可以使調(diào)用者不阻塞。
waitpid并不等待第一個終止的子進程--它有多個選項,可以控制它所等待的進程。
如果調(diào)用者阻塞而且它有多個子進程,則在其一個子進程終止時,wait就立即返回。因為wait返回子進程ID,所以調(diào)用者知道是哪個子進程終止了。
參數(shù)statloc是一個整型指針。如果statloc不是一個空指針,則終止狀態(tài)就存放到它所指向的單元內(nèi)。如果不關(guān)心終止狀態(tài)則將statloc設(shè)為空指針。
這兩個函數(shù)返回的整型狀態(tài)由實現(xiàn)定義。其中某些位表示退出狀態(tài)(正常退出),其他位則指示信號編號(異常返回),有一位指示是否產(chǎn)生了一個core文件等等。POSIX.1規(guī)定終止狀態(tài)用定義在<sys/wait.h>中的各個宏來查看。有三個互斥的宏可用來取得進程終止的原因,它們的名字都已WIF開始?;谶@三個宏中哪一個值是真,就可選用其他宏(這三個宏之外的其他宏)來取得終止狀態(tài)、信號編號等。
下面的程序中pr_exit函數(shù)使用上表中的宏以打印進程的終止狀態(tài)。
#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <stdlib.h>void pr_exit(int status) { if (WIFEXITED(status)) { printf("normal termination, exit status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("abnormal termination, signal number = %d\n", WTERMSIG(status), #ifdef WCOREDUMP WCOREDUMP(status) ? &