代码如下:
#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后,还是运行的父进程结果就变了,是另一种情况了。根据系统不同有差异的。