wait函數與waitpid函數


  1. 通過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()函數的一個特例。

  1. 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信號發送給調用進程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM