首先看看我写的代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid = vfork();
if(pid<0)
{
printf("error in fork!\n");
}
else if (pid==0)
{
printf("child PID:%d\n",getpid());
}
else
{
printf("parent PID:%d\n",getppid());
}
return 0;
}
看上去代码也没有什么错误,和国嵌提供的程序输出应该一样的,但是实际输出如下:
这个明显和国嵌提供的程序输出结果不一样。当我把最后的return 0;改为exit(0)后输出结果如下:
把return 0;改为exit(0)竟然差别这么大,这个是为什么呢?
下面是我网上找到的解释:
要理解这个问题,对于初学者有一定的难度:
1. 首先你要知道操作系统在调用的你程序时, 实际上是通过exec函数调用你程序产生相应的进程。
2. 虽然C语言程序员只填写了main函数,但是内核执行你的程序时却不是直接进入main函数,而是通过exec先执行一个通用的C启动例程(做一些初始化工作,通常是汇编代码),然后再由这个例程调用main函数。
3. 也就是说,如果你在main函数中返回, 那么就会返回该启动例程;但是如果你在main函数中调用exit或者_exit,其效果是直接结束进程(也就是不会返回启动例程)。
4. 好了, 如果你理解了上面这个过程, 接下来我们从vfork分配子进程的特点来分析这个问题。
1)vfork的第一个特点:分配的子进程会和 父进程共享数据段和堆栈段。而栈,是使函数能返回到原来调用它位置继续执行的关键(调用函数时会将返回地址入栈)。
2)vfork的第二个特点:分配后父进程一定等到子进程先执行完才会执行,因此,一定是子进程先通过main函数返回C启动例程,然后再接下来的启动例程中结束自己,但是,由于子进程main函数的返回,使栈的结构发生了变化,而这个栈是与父进程共用的,因此出现上述现象。
对于exit和return 区别见:http://blog.youkuaiyun.com/chenqiai0/article/details/8761515
这个解释我不是很明白,希望如果谁理解可以帮我解释下。