现在的位置: 首页 > 综合 > 正文

父进程等待子进程终止 wait, WIFEXITED, WEXITSTATUS

2019年06月07日 ⁄ 综合 ⁄ 共 1412字 ⁄ 字号 评论关闭
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出。如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:
pid = wait(NULL); 

如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。

WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。

#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/errno.h>
#include<stdlib.h>

extern int errno;
int main(){
        pid_t pid_one,pid_wait;
        int status;
        if((pid_one=fork())==-1)
        {
                perror("fork");
        }
        else if(pid_one==0)
        {
                printf("my pid is%d\n",getpid());
                sleep(1);
                exit(EXIT_SUCCESS);
        }
        else{
                pid_wait = wait(&status);
                if(WIFEXITED(status))
                        {
                                printf("wait on pid%d,return value is %4x\n",pid_wait,WEXITSTATUS(status));
                        }
                else if(WIFSIGNALED(status))
                        {
                                printf("wait on pid:%d,return value is %4x\n",pid_wait,WIFSIGNALED(status));
                        }
        }

        return 0;
}

编译后输出:

[root@localhost cpro]# gcc -o wait_example wait_example.c 

[root@localhost cpro]# ./wait_example 
my pid is2908
wait on pid2908,return value is    0

抱歉!评论已关闭.