回收子進程

回收子進程的函數:

pid_t wait(int *status);//成功:清理掉的子進程ID;失敗:-1(沒有子進程)

當進程終止時,操作系統的隱式回收機制會:1.關閉所有文件描述符2.釋放用戶空間分配的內存。內核的PCB仍存在。其中保存該進程的退出狀態。(正常終止——>退出值;異常終止——>終止信號)

可使用wait函數傳出參數status來保存進程的退出狀態。藉助宏函數來進一步判斷進程終止的具體原因。宏函數可分爲如下三組:

1.WIFEXITED(status)爲非0 ——>進程正常結束
WEXITSTATUS(status)如上宏爲真,使用此宏——>獲取進程退出狀態(exit的參數)

2.WIFSIGNALED(status)爲非0——>進程異常終止
WTERMSIG(status)如上宏爲真,使用此宏——>取得使進程終止的那個信號的編號。

3.WIFSTOPPED(status)爲非0——>進程處於暫停狀態
WSTOPSIG(status)如上宏爲真,使用此宏——>取得使進程暫停的那個信號的編號。
WIFCONTINUED(status)爲真——>進程暫停後已經繼續運行

waitpid函數
作用同wait,但可指定pid進程清理,可以不阻塞
pid_t waitpid(pid_t pid,int * status,int options);成功:返回清理掉的子進程ID:失敗:-1(無子進程)
特殊參數和返回情況:
參數pid:
大於0回收指定ID的子進程
負一回收任意子進程(相當於wait)
0回收和當前調用waitpid一個組的所有子進程
小於負一回收指定進程組內的任意子進程

返回0:參3爲WNOHANG,且子進程正在運行。

注意一次wait或waitpid調用只能清理一個子進程,清理多個子進程應使用循環。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章