linux 進程學習筆記-等待子進程結束


<!--[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中得到這個結構體並取得相關信息,最后結構體才會被銷毀,子進程徹底地消失了。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM