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