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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值