Linux中的wait系統呼叫

2021-05-22 16:28:06 字數 2379 閱讀 6066

系統中的殭屍程序都要由wait系統呼叫來**,下面就通過實戰看一看wait的具體用法:

wait的函式原型是:

#include /* 提供型別pid_t的定義 */

#include

pid_t wait(int *status);

程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序, wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。

引數status用來儲存被收集程序退出時的一些狀態,它是乙個指向int型別的指標。但如果我們對這個子程序是如何死掉的毫不在意,只想把這個殭屍程序消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個引數為null,就象下面這樣:

pid = wait(null);

如果成功,wait會返回被收集的子程序的程序id,如果呼叫程序沒有子程序,呼叫就會失敗,此時wait返回-1,同時errno被置為echild。

下面就讓我們用乙個例子來實戰應用一下wait呼叫:

/* wait1.c */

#include

#include

#include

#include

#include

#include

int main()

else if ( pc == 0) /* 如果是子程序 */

else /* 如果是父程序 */

exit(0); }

編譯並執行:

$ gcc wait1.c -o wait1

$ ./wait1

i am child process with pid 2351

now in parent process, pid = 2350

i am waiting child process to exit.

i catched a child process with pid of 2351

可以明顯注意到,在第2行結果列印出來前有10秒鐘的等待時間,這就是我們設定的讓子程序睡眠的時間,只有子程序從睡眠中甦醒過來,它才能正常退 出,也就才能被父程序捕捉到。其實這裡我們不管設定子程序睡眠的時間有多長,父程序都會一直等待下去,讀者如果有興趣的話,可以試著自己修改一下這個數 值,看看會出現怎樣的結果。

如果引數status的值不是null,wait就會把子程序退出時的狀態取出並存入其中,這是乙個整數值(int),指出了子程序是正常退出還是 被非正常結束的(乙個程序也可以被其他程序用訊號結束,我們將在以後的文章中介紹),以及正常結束時的返回值,或被哪乙個訊號結束的等資訊。由於這些資訊 被存放在乙個整數的不同二進位制位中,所以用常規的方法讀取會非常麻煩,人們就設計了一套專門的巨集(macro)來完成這項工作,下面我們來學習一下其中最 常用的兩個:

1,wifexited(status) 這個巨集用來指出子程序是否為正常退出的,如果是,它會返回乙個非零值。

(請注意,雖然名字一樣,這裡的引數status並不同於wait唯一的引數–指向整數的指標status,而是那個指標所指向的整數,切記不要搞混了。)

2, wexitstatus(status) 當wifexited返回非零值時,我們可以用這個巨集來提取子程序的返回值,如果子程序呼叫exit(5)退出,wexitstatus(status) 就會返回5;如果子程序呼叫exit(7),wexitstatus(status)就會返回7。請注意,如果程序不是正常退出的,也就是說, wifexited返回0,這個值就毫無意義。

下面通過例子來實戰一下我們剛剛學到的內容:

/* wait2.c */

#include

#include

#include

int main()

else /* 父程序 */

else /* 如果wifexited返回零 */

printf("the child process %d exit abnormally./n", pr);

} exit(0); }

編譯並執行:

$ gcc wait2.c -o wait2

$ ./wait2

this is child process with pid of 1538.

the child process 1538 exit normally.

the return code is 3.

父程序準確捕捉到了子程序的返回值3,並把它列印了出來。

當然,處理程序退出狀態的巨集並不止這兩個,但它們當中的絕大部分在平時的程式設計中很少用到,就也不在這裡浪費篇幅介紹了,有興趣的讀者可以自己參閱linux man pages去了解它們的用法。

關於waitpid的呼叫,請參看linux中waitpid系統呼叫一文。

linux中wait系統呼叫

系統中的殭屍程序都要由wait系統呼叫來 下面就通過實戰看一看wait的具體用法 wait的函式原型是 include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經 退出,...

wait系統呼叫

高階linux程式設計.pdf page46 wait系統呼叫 巨集wifexited和wexitstatus的定義一般在 usr include sys wait.h include include include include include include 包含對巨集wifexited和we...

系統呼叫wait

5.2系統呼叫wait 迄今為止,我們還沒做多少工作,只是建立了乙個子程序列印了點資訊就退出了。事實說明,有時候讓父程序去等待子程序結束是十分有用的。這項工作就是由wait 函式完成的 或者由waitpid 函式完成 詳見figure5.2。在程式p2.c中,父程序通過呼叫wait 函式來延遲自身的...