fork与vfork的区别

Fork()

使用fork()就要包含<sys/types.h><unistd.h>两个库;函数的形式是:pid_t fork(void);调用成功时返回两次,如果是在父进程中,返回子进程的进程号,如果在子进程中,返回0;失败时返回值为-1

在调用fork函数后,fork调用点产生与父进程相同的子进程,也就是说,fork函数后的代码是被父进程和子进程分别执行的。

Vfork()

Vfork系统调用函数与fork()调用比较类似,就不再详细介绍了。

Vfork函数用于创建新的进程,父子进程共享虚拟内存空间。在Linux系统中,vfork()的实现类似于fork(),都是用于创建调用进程的子进程。

 

两者的区别:

传统的fork()在创建新的子进程的时候会复制所有父进程所拥有的资源。当然,这一特点有它不尽如人意的地方:使用fork()创建新的进程的目的往往不是为了创建一个和父进程完全一样的进程,很多时候是为了调用exec来执行另一个可执行程序。因此,复制所有父进程的资源是多余的操作。

当使用vfork()系统调用来创建子进程的时候,不会复制父进程的相关资源,父子进程将共享地址空间。子进程对虚拟内存空间的任何修改实际上是在修改父进程虚拟内存空间的内容。在使用vfork()创建子进程后,父进程会被阻塞,直到子进程调用了exec或者_exit()退出。子进程不能使用return返回或调用exit(),但是可以调用_exit()

通过共享父进程的地址空间,vfork()避免了fork()带来的资源复制消耗。

下面简单验证下

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>

/*
 * 程序入口
 * */
int main(void)
{
	pid_t child;
	/* 创建子进程 */
	if((child=fork())==-1)
	{
		printf("Fork Error : %s\n", strerror(errno));
		exit(1);
	}
	else 
	{
		if(child==0) // 子进程
		{
			 conut++;
                         printf("the num of conut is: %d\n",conut);

			printf("I am the child: %d\n", getpid());
			exit(0);
		}
		else          //父进程
		{
			 conut++;
                         printf("the num of conut is: %d\n",conut);

			printf("I am the father:%d\n",getpid());
			return 0;
		}
	}
}	

运行结果

可以看到子进程和父进程的结果一样。

当把fork改成Vfork后,输出结果变成了


可以明显看到父进程的数值和子进程不一样,并且子进程先执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值