进程fork和vfork的区别

本文探讨了fork和vfork两种进程创建方式的区别。在fork中,父进程和子进程拥有不同的堆栈和数据资源,尽管虚拟地址空间相同但物理地址不同。而在vfork中,子进程会挂起父进程,共享所有内存,直到子进程调用execve或退出。总结来说,vfork保证子进程先运行,并且共享数据段,而fork则子进程数据段拷贝,执行次序不确定。

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

#include <stdio.h>
#include <stdlib.h>
#include <sys/type.h>
int main()
{
	int count = 1;
	int child = fork();
	if(child < 0) {
		perror("fork error");
	}
	else if(child == 0) {
		printf("this is son, %d, %p, pid = %d \n", ++count, &count, getpid());
	}
	else {
		sleep(5);
		printf("this is father, %d, %p, pid = %d \n", count, &count, getpid());
	}
	return 0;
}
---------------------------------------------------
this is son, 2, 0x7ffcc5672338, pid = 13261
this is father, 1 , 0x7ffcc5672338, pid = 13260

fork
父进程和子进程的pid不同,count变量的虚拟地址相同,count的值却不同。
可以得出:堆栈和数据资源都是完全的复制(实际是写时复制),虚拟地址空间相同,但物理地址空间不同。

#include <stdio.h>
#include <stdlib.h>
#include <sys/type.h>
int main()
{
	int count = 1;
	int child = vfork();
	if(child < 0) {
		perror("fork error");
	}
	else if(child == 0) {
		printf("this is son, %d, %p, pid = %d \n", ++count, &count, getpid());
		exit(0);
	}
	else {
		sleep(5);
		printf("this is father, %d, %p, pid = %d \n", count, &count, getpid());
		exit(0);
	}
	return 0;
}
---------------------------------------------------
this is son, 2,     0x7ffcc5672338, pid = 13261
this is father, 2 , 0x7ffcc5672338, pid = 13260

vfork
由vfork创造出来的子进程还会导致父进程挂起,除非子进程exit或者execve才会唤起父进程
由vfok创建出来的子进程共享了父进程的所有内存,包括栈地址,直至子进程使用execve启动新的应用程序为止
由vfork创建出来得子进程不应该使用return返回调用者,或者使用exit()退出,但是它可以使用_exit()函数来退出

总结:
vfork()用法与fork()相似.但是也有区别,具体区别归结为以下3点
fork() 子进程拷贝父进程的数据段,代码段.

vfork() 子进程与父进程共享数据段.|

fork() 父子进程的执行次序不确定.
vfork():保证子进程先运行,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值