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中得到这个结构体并取得相关信息,最后结构体才会被销毁,子进程彻底地消失了。 
  • 相关阅读:
    基于FPGA的均值滤波算法实现
    QuartusII 13.0 PLL IP Core调用及仿真
    varnish-4.x VCL之grace mode
    varnish-4.x VCL之cookie及缓存时间
    varnish-4.x VCL之强制cache miss
    Mariadb-Galera10二进制包安装
    MariaDB Replication
    MariaDB 使用CONNECT存储引擎
    MariaDB 使用TokuDB存储引擎
    Ubuntu启用VNC服务的配置
  • 原文地址:https://www.cnblogs.com/zendu/p/4988382.html
Copyright © 2011-2022 走看看