天天看点

关于vfork和_exit

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环境高级编程里面的代码,然后瞎想了一番得来的。

继续阅读