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

fork和vfork是两个在操作系统中常见的系统调用函数,它们用于创建新的进程。它们之间的主要区别在于父进程和子进程之间的共享资源和执行顺序。 1. fork函数: - fork函数通过复制父进程的地址空间创建一个新的子进程。父进程和子进程之间共享文件描述符、内存映射等资源,但是每个进程有自己独立的副本。 - 子进程是父进程的副本,从fork函数调用的位置开始执行,父进程和子进程的执行顺序是不确定的,取决于操作系统的调度策略。 - 子进程会继承父进程的打开文件、信号处理器、当前工作目录等状态。 - fork函数返回两次,父进程中返回子进程的ID,子进程中返回0。 2. vfork函数: - vfork函数也是通过复制父进程的地址空间创建一个新的子进程,但是与fork不同,vfork直接共享父进程的地址空间。 - 子进程共享父进程的数据段、堆栈段等资源,但是不共享代码段。子进程在执行exec或者_exit后会替换父进程的地址空间。 - 子进程必须在调用exec或者_exit之前终止或者执行另一个程序,否则可能导致父进程和子进程之间的资源冲突。 - vfork函数返回子进程的ID,与fork函数不同的是,vfork函数不会返回两次。 总结: - fork函数创建子进程时,父进程和子进程之间共享资源但具有各自独立的副本。子进程可以在任何时间执行,父进程和子进程的执行顺序不确定。 - vfork函数创建子进程时,子进程共享父进程的地址空间,但是不共享代码段。子进程必须在exec或者_exit之前终止或者执行另一个程序。 - 在使用fork和vfork时,需要根据具体的需求和场景选择合适的函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值