- 通過man命令學習wait和waitpid函數的用法
wait與waitpid函數頭文件與定義
#include<sys/types.h>
#include<wait.h>
pid_t wait(int *wstatus)
pid_t waitpid(pid_t pid,*wstatus,int options);
wait函數功能:父進程一旦調用wait函數就立即阻塞自己,由wait分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成僵屍的子進程,wait就會收集這個子進程的信息,並把它徹底銷毀后返回,如果沒有找到,就一直阻塞,直至找到一個結束的子進程或接收到了一個指定的信號為止。
waitpid函數功能:waitpid()的作用和wait()一樣,但它並不一定要等待第一個終止的子進程,它還有若干選項,如可提供一個非阻塞版本的wait()功能等。實際上wait()函數只是waitpid()函數的一個特例。
- wait函數返回值意義
Wait()與fork()配套出現,如果在fork()之前調用wait(), wait返回-1,正常情況下,應返回子進程pid。參數wtatus用來保存被收集進程退出時的狀態,它是一個指向int類型的指針,如果我們對這個子進程如何結束的不在意,只想把這個僵屍進程消滅掉,就把這個參數置為NULL,即
pid = wait(NULL);
如果成功返回子進程pid,如果沒有子進程,失敗,則返回-1。
如果如果status的值不是NULL,wait把子進程的退出狀態取出並存入其中,這是一個整數值(int)它指出了子進程是正常退出還是非正常結束,以及正常結束的返回值,或被哪個信號結束等信息。使用macro來獲取這些信息。
宏定義 描述
WIFEXITED(wstatus) 如果進程子進程正常結束,返回一個非零值
WEXITSTATUS(wstatus) 返回子進程退出碼;該值由狀態參數的最低有效8位組成(僅
當WIFEXITED返回值非零時該macro才會被調用)
WIFSIGNALED(wstatus) 如果子進程被一個信號終止,則返回一個非零值
WTERMSIG(wstatus) 返回終止這個子進程的信號碼(僅當WIFSIGNALED返回值非
零時該macro才能被調用)
WCOREDUMP(wstatus) 如果這個子進程生成了一個核心轉儲(core dump),返
回一個非零值(僅當WIFSIGNALED返回值非零時該macro才
會被調用)
WIFSTOPPED(wstatus) 如果子進程因接收一個信號暫停,返回一個非零值
WSTOPSIG(wstatus) 返回這個暫停信號的信號碼(僅當WIFSTOPPED返回值非零
時該macro才會被調用)
WIFCONTINUED(wstatus) 如果子進程因接收一個信號而恢復運行,則返回一個非零值
編寫代碼並測試,結果如圖所示
PS:abort()函數功能:立即終止當前進程,產生異常程序終止,此函數將SIGABRT信號發送給調用進程。