程序終止信号
當一個程序正常或異常終止時,核心就向其父程序發送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 |