Linux下wait, WIFEXITED, WEXITSTATUS的比較

偶爾翻到了這幾個關鍵字,找到個文章複習了下:“http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part3/”。記錄下:

wait的函數原型是:

 #include <sys/types.h> /* 提供類型pid_t的定義 */ #include <sys/wait.h> pid_t wait(int *status)

進程一旦調用了wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它徹底銷燬後返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。

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

 pid = wait(NULL); 

如果成功,wait會返回被收集的子進程的進程ID,如果調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置爲ECHILD。


如果參數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,這個值就毫無意義。

當然,處理進程退出狀態的宏並不止這兩個,但它們當中的絕大部分在平時的編程中很少用到。
轉自http://blog.163.com/kissinger_1984/blog/static/168992520104255263314/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章