当前位置:网站首页>辨析fork与vfork
辨析fork与vfork
2022-08-09 15:02:00 【翔在天上飞】
首先,这两个函数都是用于创建一个子进程
如果要辨析fork与vfork,一句话通俗的说,fork是复制于父进程、vfork是共享于父进程
详细如下:
fork函数复制一个父进程的副本,从而拥有独立的代码段,数据段以及堆栈,既称为一个独立的实体,而vfork是共享父进进程的代码以及数据段。并且,fork在执行父子进程的顺序是随机的,而vfork在执行父子进程时,一定是先执行子进程,再执行父进程
首先来看fork
拿fork举一个例子:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
int a = 5;
pid_t pid = -1;
//创建进程
//返回值:失败返回-1,成功0是子进程,>0是父进程
pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}
else if(0 == pid)
{
printf("此处是子进程");
a = a+2;
printf("a = %d\n",a);
}
else
{
printf("此处是父进程");
a = a+3;
printf("a = %d\n",a);
}
return 0;
}
注意看a的值的输出,运行结果如下:

分析:
我们在创建一个子进程之前定义了一个变量a,并赋予这个变量初值为5,这个变量首先是属于父进程的(在fork之前)。
在使用了fork函数之后,子进程被创建,他复制了父进程中的a这个变量,以及他的值,注意是复制。
然后,在后面的操作中,子进程中被加了2,父进程中被加了3,可以看到的结果是,两次输出的结果并没有关联,是分别对两个独立的a进行了各自的操作。
我们再来看vfork
也使用一个例子来说明:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
int a = 5;
pid_t pid = -1;
//创建进程
//返回值:失败返回-1,成功0是子进程,>0是父进程
pid = vfork();
if(pid < 0)
{
perror("vfork error");
return -1;
}
else if(0 == pid)
{
printf("此处是子进程");
a = a+2;
printf("a = %d\n",a);
exit(0);
}
else
{
printf("此处是父进程");
a = a+3;
printf("a = %d\n",a);
exit(0);
}
return 0;
}
运行结果:

分析:
首先,一点要说明的是,在使用vfork时,子进程必须进行exit进程退出,才能进父进程,另外,可以发现的是,在子进程中对a做出的改变在父进程中有体现,这也证实了vfork创建的子进程是与父进程资源共享的
边栏推荐
猜你喜欢
随机推荐
缓存层与数据库层数据同步问题
ASCII码表
相关性分析
软件安全内存区域详解
如何不使用第三个变量来交换两个数的值
webSocket的实现
多元回归分析
堆(heap)系列_0x02:堆的前世今生(WinDbg+Visual Studio汇编)
Face recognition sample code analysis (1) - program parameter analysis
转载-文件资源管理器无响应的解决办法
Fiddler抓包夜神模拟器
Vim实用技巧_1.vim解决问题的方式
Unity Shader零基础入门1:纯色物体
The experience of using Photoshop CS6
初级软件测试面试题
堆(heap)系列_0x07:NT堆调试支持_滞后发现调试支持
Excel文件解析
如何保证测试用例的覆盖率
机器学习的基本术语
Unity Shader 透视效果/XRay









