当前位置:网站首页>辨析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创建的子进程是与父进程资源共享的
边栏推荐
- gccg++基本命令简介
- 灰色关联度矩阵——MATLAB在数学建模中的应用
- Gray Relevance Matrix——Application of MATLAB in Mathematical Modeling
- Vim实用技巧_1.vim解决问题的方式
- Excel文件解析
- GStreamer应用开发手册学习笔记之二
- Basic Concepts of Software Security
- Heap series_0x08: NT heap debug support_Discover now debug support (DPH)
- #define DEBUG(format, ...) 以及 #、##、__VA_ARGS__和##__VA_ARGS__的作用
- 【QT】QLayout: Attempting to add QLayout “to ***“, which already has a layout的终极解决方法
猜你喜欢
同步锁synchronized追本溯源
图论最短路径求解
The practical skills Vim _1. Vim way of solving problems
Time series analysis
TCP/IP协议组——完整工作过程分析
unity中AO、metallic、roughness贴图的使用方式
Heap series_0x08: NT heap debug support_Discover now debug support (DPH)
Face recognition sample code analysis (1) - program parameter analysis
Vim practical skills_4. Manage multiple files (open + split + save + netrw)
【Postgraduate Work Weekly】(The third week)
随机推荐
properties文件的读取和写入
前置后置运算符重载
堆(heap)系列_0x02:堆的前世今生(WinDbg+Visual Studio汇编)
TOPSIS优劣解距离法
【QT】QLayout: Attempting to add QLayout “to ***“, which already has a layout的终极解决方法
Vim实用技巧_3.可视模式和命令模式
SVM Support Vector Machine - Application of MATLAB in Mathematical Modeling
堆(heap)系列_0x04:堆的内部结构(_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY)
同步锁synchronized追本溯源
Excel文件解析
2022.7.22FPGA学习总结:项目实践——按键消抖模块
安装MySQL时出现starting the server失败
gccg++基本命令简介
架构实战营第九模块作业-毕业项目
MATLAB Solution to Planning Problems - MATLAB in Mathematical Modeling (2nd Edition)
SQLMap常用命令介绍
webSocket的实现
unity中AO、metallic、roughness贴图的使用方式
如何用栈实现队列
堆(heap)系列_0x08:NT堆调试支持_立刻发现调试支持(DPH)