Linux監聽子執行緒的函式

2021-06-16 06:39:03 字數 3799 閱讀 6830

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 觸發父元件的事件 更簡單的...