exit 和_exit的区别是:exit是要做一些操作才进入内核终结的,比如清除缓存之类的。但是_exit()则是立即进入内存终结,不会进行exit该有的操作。这样就出现这样的问题。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
_exit(0);
}
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
上面的代码输出是有的,var和glob都是自增了1。但是如果将_exit(0)改成exit(0),情况会是什么呢?因为vfork是在父进程空间运行的,那会不会不会输出呢。
我的linux是centOS 5.5。当然没有出现那个问题。输出与_exit(0)是一样的。我就多运行了几次,还是一样的。估计是系统做了什么修改吧。
那怎么可以实现不输出呢。答案当然是关闭输出流。
close(STDOUT_FILENO);他是在
<unistd.h>
包里面的。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
close(STDOUT_FILENO);
exit(0);
}
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
这样的结果是,还是会有输出。输出结果与最开始是一样的。我就又改了改。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
exit(0);
}
close(STDOUT_FILENO);
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
这样,就没有输出了。
但是vfork是在父进程里面运行的,我很纳闷,为什么在子进程里面关闭输出流不行?VFORK不是占用的父进程的空间运行吗?这个我是借鉴在UNIX环境高级编程里面的代码,然后瞎想了一番得来的。