zoukankan      html  css  js  c++  java
  • 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...
    ");
        
        printf("do something in main process
    ");
        
        sleep(5);
        
        if(fork() == 0)
        {
            printf("do something in child process ...
    ");
            
            sleep(5);
            
            exit(EXIT_SUCCESS);
            
            printf("this will not been executed
    ");
        }
        
        int status;
        wait(&status);
            
        printf("app end
    ");
            
        return 0;
    }
    
    我们知道,当进程结束后,进程的大部分资源会被回收,比如释放内存,关闭描述符等,但表示进程的那个结构体STRUCT_TASK却还存在,此时的进程相当于“灵魂已亡,尸体犹在”,所以称之为ZOMBIE状态,这个结构体存在是有它的意义的,因为进程在退出前会将一些信息保存在其中,父进程可以在wait或waitpid中得到这个结构体并取得相关信息,最后结构体才会被销毁,子进程彻底地消失了。 
  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/zendu/p/4988382.html
Copyright © 2011-2022 走看看