學習筆記 父程序wait和waitpid

2022-05-07 16:42:08 字數 2724 閱讀 7569

1、wait和waitpid出現的原因

sigchld

q  當子程序退出的時候,核心會向父程序傳送sigchld訊號,子程序的退出是個非同步事件(子程序可以在父程序執行的任何時刻終止)

q  子程序退出時,核心將子程序置為殭屍狀態,這個程序稱為殭屍程序,它只保留最小的一些核心資料結構,以便父程序查詢子程序的退出狀態。

父程序查詢子程序的退出狀態可以用wait/waitpid函式

2、wait和waitpid函式用法

wait

q  標頭檔案和

q  函式功能:當我們用fork啟動乙個程序時,子程序就有了自己的生命,並將獨立地執行。有時,我們需要知道某個子程序是否已經結束了,我們可以通過wait安排父程序在子程序結束之後。

q  函式原型

q  pid_t wait(int *status)

q  函式引數

q  status:該引數可以獲得你等待子程序的資訊

q  返回值:

q  成功等待子程序函式返回,返回值是等待子程序的id

q  wait系統呼叫會使父程序暫停執行,直到它的乙個子程序結束為止。

q  返回的是子程序的pid,它通常是結束的子程序

q  狀態資訊允許父程序判定子程序的退出狀態,即從子程序的main函式返回的值或子程序中exit語句的退出碼。

q  如果status不是乙個空指標,狀態資訊將被寫入它指向的位置

wait獲取status後檢測處理

巨集定義     描述

wifexited(status)  如果子程序正常結束,返回乙個非零值

wexitstatus(status)      如果wifexited非零,返回子程序退出碼

wifsignaled(status)     子程序因為捕獲訊號而終止,返回非零值

wtermsig(status) 如果wifsignaled非零,返回訊號**

wifstopped(status)       如果子程序被暫停,返回乙個非零值

wstopsig(status)   如果wifstopped非零,返回乙個訊號**

waitpid

q函式功能:用來等待某個特定程序的結束

q函式原型:

pid_t waitpid(pid_t pid, int *status,int options)

q引數:

q  status:如果不是空,會把狀態資訊寫到它指向的位置

qoptions:允許改變waitpid的行為,最有用的乙個選項是wnohang,它的作用是防止waitpid把呼叫者的執行掛起

q  返回值:如果成功返回等待子程序的id,失敗返回-1

對於waitpid的p i d引數的解釋與其值有關:

q  pid == -1 等待任一子程序。於是在這一功能方面waitpid與wait等效。

q  pid > 0 等待其程序i d與p i d相等的子程序。

q  pid == 0 等待其組i d等於呼叫程序的組i d的任一子程序。換句話說是與呼叫者程序同在乙個組的程序。

q  pid

< -1 等待其組i d等於p i d的絕對值的任一子程序。

3、wait pk waitpid

wait和waitpid區別和聯絡

q  在乙個子程序終止前, wait 使其呼叫者阻塞,而waitpid 有一選擇項,可使呼叫者不阻塞。

q  waitpid並不等待第乙個終止的子程序—它有若干個選擇項,可以控制它所等待的特定程序。

q  實際上wait函式是waitpid函式的乙個特例。

殭屍程序

q  當乙個子程序結束執行時,它與其父程序之間的關聯還會保持到父程序也正常地結束執行或者父程序呼叫了wait才告終止。

程序表中代表子程序的資料項是不會立刻釋放的,雖然不再活躍了,可子程序還停留在系統裡,因為它的退出碼還需要儲存起來以備父程序中後續的wait呼叫使用。它將稱為乙個「僵程序」

如何避免殭屍程序

q  呼叫wait或者waitpid函式查詢子程序退出狀態,此方法父程序會被掛起。

q  如果不想讓父程序掛起,可以在父程序中加入一條語句:signal(sigchld,sig_ign);表示父程序忽略sigchld訊號,該訊號是子程序退出的時候向父程序傳送的。

#include #include 

#include

"errno.h

"#include

"stdio.h

"#include

"stdlib.h

"#include

"string.h

"#include

#include

void loopfunc(int

num)

int main(void

)

if (pid == 0

)

exit(

0); //

讓子程序跑圈 子程序不參與下一次的fork

}

if (pid > 0) //

大於0是父程序

}//退出

printf("

after fork \n");

intmypid ;

while( (mypid = waitpid(-1, null, wnohang)) > 0

)

return0;

}

複製去google翻譯

wait 函式父程序等待子程序退出

include include pid t wait int status pid t waitpid pid t pid,int status,int options include include pid t wait int status pid t waitpid pid t pid,int...

linux程序學習,使用wait函式

include include include include include include int main else if pc 0 子程序 else 父程序 else 如果wifexited返回零 exit 0 注意 1.wait函式的使用時如果需要知道退出時候的返回值,呼叫wait函式的時...

程序的等待(wait和waitpid)

1.程序的等待 wait函式或waitpid程序可能發生如下情況 1 如果所有的子程序孩子執行,則阻塞 block 2 如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則取得孩子程序的終止狀態返回 3 如果她沒有任何子程序,則立即出錯返回 函式的原型 include pid t wait int...