fork和vfork的区别

本文通过一个简单的C语言程序对比了fork与vfork两种进程创建方式的不同之处。使用fork时,父进程与子进程各自拥有独立的数据副本;而使用vfork时,父进程与子进程共享同一份数据。此外,文章还解释了为何在vfork中必须使用exit而非return的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fork:拷贝了一份父进程的数据,也就是说父子之间互不干涉

vfork:与父进程共享同一份数据


程序参考:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
	int var;
	var = 88;
	pid_t pid;
	if ((pid = fork()) < 0) {
		printf("vfork error");
		exit(-1);
	} else if (pid == 0) { /* 子进程 */
		var++;
		printf("pid=%d,var=%d\n", getpid(), var);
		return 0;
		//exit(0);
	}
	printf("pid=%d,var=%d\n", getpid(), var);
	return 0;
}

运行结果:

pid=4684,var=89
pid=4683,var=88
因为此处用的是fork,所以父子之间互不干涉。

子进程中的var加一后,变为89。

而父进程中的var依然为88。


如果改为vfork,结果为:

pid=4785,var=89
pid=4784,var=89
因为共享数据了。


如果直接粘贴上述代码,只将fork改为vfork,会出现段错误。

原因是,在fork中用return语句是允许的。

因为子进程是复制了一份数据。

然而,在vfork中用return语句,因为父子共享,则会导致栈的崩溃。

也就是父进程不能够继续执行下去了。

因此,在vfork中需要用exit()函数。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值