<!--[if !supportLists]-->Ÿ <!--[endif]-->等待子進程結束 pid_t waitpid(pid_t pid, int *stat_loc, int options) 另外有一個函數叫wait,其相當於 waitpid(-1, &status, 0) 大家經常看到的關於waitpid的經典例子是:你下載了某個軟件的安裝程序A,其在安裝即將結束時啟動了另外一個流氓軟件的安裝程序B,當B也安裝結束后,其告訴你所有安裝成功了。A和B分別在不同的進程中,A如何啟動B並知道B安裝完成了呢?可以很簡單地在A中用fork啟動B,然后用waitpid(或wait)來等待B的結束。 參數pid: 如果大於0,表示父進程所需要等待的子進程的進程號 如果等於0,則表示任意任意group id和父進程相同的子進程 如果等於-1, 則表示等待任意子進程(有多個子進程時,任意進程結束,函數都會返回),此時waitpid和wait相同。 如果小於-1,則取其絕對值作為需要等待的子進程的進程號 參數stat_loc: 表示進程退出時進程狀態的存儲位置,有一些專門的宏類根據該位置計算狀態值,可以參考這里。 參數options: 這個參數控制函數是否立即返回,它有三個值:0,WNOHANG(值為1),WUNTRACED(值為2),這三個值多少讓有有些迷惑,有個帖子中是如此說的:options的各個常量不是互斥關系,而是通過按位或運算組合起來的關系。進程的狀態數是有限的,所有的進程狀態改變可能性,是一個元素個數有限的集合,waitpid中指定的子進程的狀態改變,必然是這個集合的子集,記為A。options決定如何取A中的元素,默認時(0),只有A不是空集的時候,才會返回,否則阻塞。WNOHANG 告訴waitpid,即使A是空集,也不會掛起,而是立即返回。WUNTRACED 告訴waitpid,如果A中含有進程STOPED狀態,也立即返回。如果是被trace的子進程,那么即使不提供WUNTRACED參數,也會理解返回。 #include <stdio.h> //for printf() #include <unistd.h> //for fork() #include <sys/wait.h> //for wait() #include <stdlib.h> //for EXIT_SUCCESS int main () { printf("app start...\n"); printf("do something in main process\n"); sleep(5); if(fork() == 0) { printf("do something in child process ...\n"); sleep(5); exit(EXIT_SUCCESS); printf("this will not been executed\n"); } int status; wait(&status); printf("app end\n"); return 0; } 我們知道,當進程結束后,進程的大部分資源會被回收,比如釋放內存,關閉描述符等,但表示進程的那個結構體STRUCT_TASK卻還存在,此時的進程相當於“靈魂已亡,屍體猶在”,所以稱之為ZOMBIE狀態,這個結構體存在是有它的意義的,因為進程在退出前會將一些信息保存在其中,父進程可以在wait或waitpid中得到這個結構體並取得相關信息,最后結構體才會被銷毀,子進程徹底地消失了。