天天看點

函數wait和waitpid程序終止信号wait與waitpid差別wait與waitpid作用wait()waitpid()

程序終止信号

當一個程序正常或異常終止時,核心就向其父程序發送SIGCHLD信号,因為子程序終止是個異步事件(這可以在父程序運作的任何時候發生),是以這種信号也是核心向父程序發的異步通知。父程序可以選擇忽略該信号,或者提供一個該信号發生時即被調用執行的函數(信号處理函數)。對于這種信号的系統預設動作是忽略它。

wait與waitpid差別

  • 在一個子程序終止前,wait使其調用者阻塞,而waitpid有一個選項,可使調用者不阻塞;
  • waitpid并不等待在其調用之後的第一個終止的子程序,它有若幹個選項,可以控制它所等待的程序;

wait與waitpid作用

父程序要調用wait或waitpid對結束(或被kill掉)的子程序進行回收,否則子程序将變成僵屍程序。

wait()

傳回值:

成功結束運作的子程序的程序号;

失敗傳回-1;

參數:

status如果不是一個空指針,則終止程序的終止狀态就存放在statloc所指向的單元;

status如果是一個空指針,則表示父程序不關心子程序的終止狀态;

waitpid()

參數:

pid>0 隻等待程序ID等于pid的子程序,不管其它已經有多少子程序運作結束退出
pid=-1 等待任何一個子程序退出,沒有任何限制,此時waitpid和wait的作用一模一樣
pid=0 等待同一個程序組中的任何子程序,如果子程序已經加入了别的程序組,waitpid不會對它做任何理睬
pid<-1 等待一個指定程序組中的任何子程序,這個程序組的ID等于pid的絕對值
  • status如果不是一個空指針,則終止程序的終止狀态就存放在status所指向的單元。;
  • status如果是一個空指針,則表示父程序不關心子程序的終止狀态;

option

WNOHANG 若由pid指定的子程序未發生狀态改變(沒有結束),則waitpid()不阻塞,立即傳回0
WUNTRACED 傳回終止子程序資訊和因信号停止的子程序資訊
WCONTINUED 傳回收到SIGCONT信号而恢複執行的已停止子程序狀态資訊

傳回值:

成功 傳回結束運作的子程序的程序号
失敗 傳回-1
WNOHANG 沒有子程序退出傳回0

繼續閱讀