waitpid案例2

代码如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<wait.h>
#include<errno.h>
pid_t Fork(void)
{
    pid_t pid;
    if((pid=fork())<0)
    {
        perror("Fork error");
    }
    return pid;
}
int main()
{
    int status;
    pid_t pid;
    printf("hello\n");
    pid=Fork();
    printf("%d\n",!pid);
    if(pid!=0)
    {
        if(waitpid(-1,&status,0)>0)
        {
            //判断子进程是否正常终止,exit。
            if(WIFEXITED(status)!=0)
            {
                printf("%d\n",WEXITSTATUS(status));

            }
        }
    }
    printf("bye\n");
    exit(2);

}

这个是书上的一个思考题,问程序可能产生多少行输出,这些输出行的一种可能顺序是什么。我实验的结果是



现在根据结果思考过程:

第一步在父进程输出hello,然后fork 的运用产生了一个新的进程,这个函数两个返回值,在父进程返回的是子进程PID号,子进程返回的是0.先记住是在fork函数出现后才有的子进程,执行

 printf("%d\n",!pid);
的时候pid是0,说明此时运行的是子进程,if语句不成立,所以没有执行,接着到了输出bye,然后子进程退出,退出时候的状态号为2,然后切换到父进程,再次执行fork 函数后面的语句,此时的pid的值是子进程的pid号,所以输出了0,然后if语句可以执行,waitpid函数此时要回收刚刚退出的子进程资源,因为子进程是通过exit(2)语句终止的当然是正常终止,所以
WEXITSTATUS(status)
这个值是2,也就是终止时候的状态号。

这是其中一种情况,当然如果fork后,还是运行的父进程结果就变了,是另一种情况了。根据系统不同有差异的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值