waitpid系統呼叫】
功能描述:
等待程序改變其狀態。所有下面哪些呼叫都被用於等待子程序狀態的改 變,獲取狀態已改變的子程序資訊。狀態改變可被認為是:1.子程序已終止。2.訊號導致子程序停止執行。3.訊號恢復子程序的執行。在子程序終止的情況 下,wait呼叫將允許系統釋放與子程序關聯的資源。如果不執行wait,終止了的子程序會停留在"zombie"狀態。
如果發現子程序改變了狀態,這些呼叫會立即返回。反之,呼叫會被阻塞直到子程序狀態改變,或者由訊號處理控制代碼所中斷(假如系統呼叫沒有通過sigaction的sa_restart標誌重啟動)。
wait 系統呼叫掛起當前執行中的程序,直到它的乙個子程序終止。waitpid掛起當前程序的執行,直到指定的子程序狀態發生變化。預設,waitpid只等待 終止狀態的子程序,但這種行為可通過選項來改變。waitid系統呼叫對於等待哪個子程序狀態改變提供了更精確的控制。
子程序已終 止,父程序尚未對其執行wait操作,子程序會轉入「僵死」狀態。核心為「僵死」狀態的程序保留最少的資訊量(程序標識,終止狀態,資源使用資訊),過後 父程序執行wait時可以獲取子程序資訊。只要僵死的程序不通過wait從系統中移去,它將會佔據核心程序表中的乙個字段。如果程序表被填滿,核心將不能 再產生新程序。如果父程序已終止,它的僵死子程序將由init程序收養,並自動執行wait將它們移去。
用法:
#include
#include
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
引數:
pid:可能值有以下
小於-1 //意味著等待所有其程序組標識等於pid絕對值的子程序。
-1 //意味著等待任何子程序。
0 //意味著等待任何其組標識等於呼叫程序組標識的程序。
大於0 //意味著等待其程序標識等於pid的程序。
status:指向子程序的返回狀態,可通過以下巨集進行檢索
wifexited(status) //返回真如果子程序正常終止,例如:通過呼叫exit(),_exit(),或者從main()的return語句返回。
wexitstatus(status) //返回子程序的退出狀態。這應來自子程序呼叫exit()或_exit()時指定的引數,或者來自main內部return語句引數的最低位元組。只有wifexited返回真時,才應該使用。
wifsignaled(status) //返回真如果子程序由訊號所終止
wtermsig(status) //返回導致子程序終止的訊號數量。只有wifsignaled返回真時,才應該使用。
wcoredump(status) //返回真如果子程序導致核心轉存。只有wifsignaled返回真時,才應該使用。並非所有平台都支援這個巨集,使用時應放在#ifdef wcoredump ... #endif內部。
wifstopped(status) //返回真如果訊號導致子程序停止執行。
wstopsig(status) //返回導致子程序停止執行的訊號數量。只有wifstopped返回真時,才應該使用。
wifcontinued(status) //返回真如果訊號導致子程序繼續執行。
options:可以是0個或多個以下符號常量通過or運算的組合體
wnohang //如果沒有子程序退出,立即返回
wuntraced //如果有處於停止狀態的程序將導致呼叫返回。
wcontinued //如果停止了的程序由於sigcont訊號的到來而繼續執行,呼叫將返回。
下面是linux特有的選項,不能用於waitid
__wclone //只等待"clone"的子程序。乙個"clone" 程序即是終止時不會給父程序傳送訊號,或者不會給父程序傳送sigchld訊號的程序。
__wall //等待所有型別的子程序,包括"clone"和"non-clone"。
__wnothread //不會等待同一執行緒組的其它執行緒的子孫。
wuntraced 和 wcontinued 只有在sigchld訊號沒有設定sa_nocldstop標誌時才起作用。
idtype,id:這兩個引數結合在一起指出應選擇等待哪些子程序,可能情況有
idtype == p_pid //等待程序標識與id匹配的子程序。
idtype == p_pgid //等待程序組標識與id匹配的任何子程序。
idtype == p_all //等待任何子程序,id無作用
可在options引數中指定的感興趣的子程序狀態改變標誌有以下常量,可以通過or運算加以組合
wexited //等待已終止的子程序。
wstopped //等待由於訊號已停止執行的子程序。
wcontinued //等待由於訊號已恢復執行的子程序。
wnohang //作用如同waitpid。
wnowait //保留子程序的可等待狀態,後面的wait呼叫可再次獲取子程序的狀態資訊。
infop:成功執行返回時,waitid將填充infop所指向結構體的如下字段
si_pid //子程序標識。
si_uid //子程序的真實使用者標識。
si_signo //總被設定為sigchld。
si_status //子程序的退出狀態,或者導致子程序退出,停止執行或恢復執行的訊號,需要根據si_code欄位來解釋。
si_code //可能值有cld_exited(子程序呼叫_exit退出), cld_killed(子程序被訊號殺死),cld_stopped(訊號導致子程序停止執行),cld_continued(訊號恢復子程序繼續執行)。
返回說明:
wait():成功執行時,返回終止子程序的標識。失敗返回-1;
waitpid():成功執行時,返回狀態改變的子程序標識。失敗返回-1;如果指定wnohang標誌,同時pid指定的程序狀態沒有發生變化,將返回0。
waitid():成功執行或者wnohang標誌被設定而id指定的子程序狀態沒有發生變化時返回0。失敗返回-1。
出錯值可能有下面這些
echild:引數指定的程序不存在,或者並非呼叫程序的子程序
eintr;wnohang不被設定,同時捕捉到乙個不被阻塞的訊號或sigchld訊號
einval:options引數無效
例子:$ ./a.out &
child pid is 32360
[1] 32359
$ kill -stop 32360
stopped by signal 19
$ kill -cont 32360
continued
$ kill -term 32360
killed by signal 15
[1]+ done ./a.out
$#include
#include
#include
#include
int main(int argc, char *argv)
if (cpid == 0) else
if (wifexited(status)) else if (wifsignaled(status)) else if (wifstopped(status)) else if (wifcontinued(status))
} while (!wifexited(status) && !wifsignaled(status));
exit(exit_success);
}
VUE父元件監聽子元件的生命週期
比如有父元件 parent 和子元件 child,如果父元件監聽到子元件掛載 mounted 就做一些邏輯處理,可以通過以下寫法實現 parent.vue dosomething child.vue mounted 這屬於手動通過 emit觸發父元件的事件,實現監聽生命週期的作用。簡單的方式可以在父...
vue中父元件如何監聽子元件值的變化
vue中我們會遇到很多父子元件通訊的需求,下面簡單列一下,父子元件通訊的幾種情況 1 父元件向子元件傳值 使用prop向子元件傳值 2 子元件實時監聽父元件傳來的值的變化 使用watch去監聽父元件傳來的值 3 父元件可以通過this.refs.name.去訪問子元件的值或方法 4 子元件可以通過t...
Vue 父元件如何監聽子元件的生命週期
這裡以 mounted 為例,在父元件 parent 和子元件 child 中,如果父元件監聽到子元件掛載 mounted 就做一些邏輯處理,可以通過以下寫法實現 parent.vue child.vue mounted 以上方法雖然可行,但每次都需要手動寫一次 emit 觸發父元件的事件 更簡單的...