系統中的殭屍程序都要由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 函式來延遲自身的...