您的位置:首页 > 运维架构 > Linux

Linux之进程等待

2016-06-27 16:13 495 查看
      》 一个进程的退出可能是正常退出也可能是异常退出,进程的PCB则会记录这些信息:如果是正常退出则记录退出转台,若为异常退出,则记录进程退出信号。父进程可以通过调用wait或者waitpid来获取这些信息。

       那么父进程调用wait函数会发生什么状况呢?

        1.如果其所有子进程还在运行,则导致阻塞

        2.如果子进程已经终止,正在等待父进程获取退出状态,则可以获取进程退出信息并返回

        3.若果没有子进程,则出错退出

       所以wait函数就是,必须得子进程结束父进程才可以调用它,子进程就等着你来得到它的退出情况呢,如果子进程还没运行完,你就急着来wait,那么就会导致进程阻塞。

    》  头文件:

             #include<sys/types.h>

             #include<sys/wait.h>

等待函数1. pid_t   wait(int* status)成功返回子进程pid失败返回-1   status获取子进程的退出状态,不关心则只置为NULL

   $如果进程由于接收到了SIGCHILD而调用wait函数,则可以期望wait会立即返回不会造成进程阻塞,否则,可能会造成调用进程阻塞

   $若status不为空则子进程的退出状态存放在它所指定的单元内,否则置为NULL就好

等待函数2. pid_t  waitpid(pid_t pid,int* status,int options)

      返回值分析:

              1.当正常返回时,waitpid会得到子进程的pid

              2.若设置了选项WNOHANG(未阻塞),没有终止子进程可以收集则返回0

              3、如果调用中出错则返回-1,并且erron会设置成相应的值来指示错误的位置

              4.如果pid所指示的子进程不存在或者子进程不是调用进程的子进程,则waitpid出错返回,并且erron会置为ECHILD

          pid:

         pid=-1:等待进程的任一个子进程

         pid>0:等待进程子进程ID等于pid的进程

         pid==0:等待其组ID等于调用进程组ID的任一进程

         pid<-1:等待其组ID等于pid绝对值的任一进程

      status:

          WIFEXITED(status):若返回正常终止子进程的状态则为真(查看子进程是否正常退出)

          WEXITSTATUS:若WEXITSTATUS非零,则提取子进程的退出码

       options:

       WNOHANG :若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。(进程是否阻塞)

       WIFEXITED(status) : 若为正常终止子进程返回的状态,则为真。

       // 举例:1. 正常创建父子进程,子进程正常退出,父进程等待,并获取退出状态status。调用该宏,查看输出结果(正常为非0,或1)。2. 正常创建父子进程,子进程pause(),父进程等待,并设置获取退出状态status,kill杀掉子进程。调用该宏,查看输出结果(结果为0)。(进程等待状态是否正常)

      WEXITSTATUS(status) : 若WIFEXITED非零,返回子进程退出码,提取进程退出返回值,如果子进程返回

exit(7),WEXITSTATUS(status)就会返回7.请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。(获取进程退出码)

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: