1、當一程序終止的時候,如果想要知道終止程序的一些資訊。我們可以使用函數wait 和 waitpid。
包涵的頭檔案
#include< sys/types.h> #include<sys/wait.h>
函數原型如下:
pid_t wait (int * status);
pid_t waitpid(pid_t pid,int * status,int options);
status 是一個整形指針,存放的就是程序的終止狀态。waitpid比wait多了兩個參數,是以waitpid的功能肯定比wait強上不少。這一點,waitpid肯定包含了wait的功能。是以建議多多使用waitpid。還有一些原因下面會說。
2、差別:
2.1、wait是一個阻塞的函數,當我們使用wait函數,但是沒有程序終止的時候,wait函數會阻塞。但是waitpid有一個參數,可以讓其不阻塞。就是可以設定第三個參數為WNOHANG。
2.2、wait隻能等待其調用之後的第一個終止的程序。但是waitpid則不一樣,它有多個選項,可以控制等待其他的程序,第一個參數就是這樣,它可以是具體某一個程序的pid,這樣就指定等待那個程序。也可以是一些特殊的值,有特殊的含義。
參照百度百科上所說,我這裡copy一段:
pid<-1 等待 程序組識别碼為 pid 絕對值的任何子程序。 pid=-1 等待任何子程序,相當于 wait()。 pid=0 等待 程序組識别碼與目前程序相同的任何子程序。 pid>0 等待任何子程序識别碼為 pid 的子程序。
關于status傳回值,有多種情況,也是copy、百度百科,上面寫的跟一些經典的書籍,比如《Unix進階環境程式設計》是一緻的。
WIFEXITED(status)如果若為正常結束子程序傳回的狀态,則為真;對于這種情況可執行WEXITSTATUS(status),取子程序傳給exit或_eixt的低8位。 WEXITSTATUS(status)取得子程序 exit()傳回的結束代碼,一般會先用 WIFEXITED 來判斷是否正常結束才能使用此宏。 WIFSIGNALED(status)若為異常結束子程序傳回的狀态,則為真;對于這種情況可執行WTERMSIG(status),取使子程序結束的信号編号。 WTERMSIG(status) 取得子程序因信号而中止的信号代碼,一般會先用 WIFSIGNALED 來判斷後才使用此宏。 WIFSTOPPED(status) 若為目前暫停子程序傳回的狀态,則為真;對于這種情況可執行WSTOPSIG(status),取使子程序暫停的信号編号。 WSTOPSIG(status) 取得引發子程序暫停的信号代碼,一般會先用 WIFSTOPPED 來判斷後才使用此宏。 如果執行成功則傳回子程序識别碼(PID) ,如果有錯誤發生則傳回 傳回值-1。失敗原因存于 errno 中。
關于最後一個參數,表示我們的一些附加選項,比如剛剛WNOHANG。如果不想使用它就設定為0就行。可以使用“|”符号來連接配接多個附加選項。
2.3、當有多個程序的時候,wait函數就有點不夠用了。這個時候隻能用waitpid。因為wait隻是得到第一個程序終止狀态,就傳回了。其他的程序還是會變成僵屍程序。