当前位置:网站首页>辨析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创建的子进程是与父进程资源共享的
边栏推荐
- Heap series _0x02: The past and present of the heap (WinDbg+Visual Studio compilation)
- 堆(heap)系列_0x08:NT堆调试支持_立刻发现调试支持(DPH)
- Vim practical skills_3. Visual mode and command mode
- 云模型和Logistic回归——MATLAB在数学建模中的应用(第2版)
- C语言,输入一个10以内的随机数,按要求求得表达式的值。
- webSocket的实现
- Word 2016 撰写论文(1): 公式居中、编号右对齐
- Vim实用技巧_4.管理多个文件(打开 + 切分 + 保存 + netrw)
- unity中AO、metallic、roughness贴图的使用方式
- wireshark抓包新手使用教程
猜你喜欢
Heap series _0x02: The past and present of the heap (WinDbg+Visual Studio compilation)
【Postgraduate Work Weekly】(The third week)
数学规划模型
TCP/IP协议组——完整工作过程分析
idea 用不了Ctrl+Shift+F快捷键全局搜索。
Heap series _0x04: Internal structure of heap (_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY)
多元回归分析
Word 2016 撰写论文(1): 公式居中、编号右对齐
Excel绘制统计图
Heap series _0x03: heap block + malloc/new bottom layer + LFH (WinDbg analysis)
随机推荐
Correlation analysis
杭州富阳科目三新规3号线考试攻略
聚集索引和非聚集索引
easywsclient的DEMO测试
Heap series _0x02: The past and present of the heap (WinDbg+Visual Studio compilation)
数据拟合方法 MATLAB在数学建模中的应用(第二版)
Heap series_0x08: NT heap debug support_Discover now debug support (DPH)
如何用栈实现队列
基于X264的动态帧率与动态码率调整的实现
Analytic Hierarchy Process (AHP) - Applications of MATLAB in Mathematical Modeling (2nd Edition)
Principal Component Analysis - Applications of MATLAB in Mathematical Modeling (2nd Edition)
List,Set,Map,Queue,Deque,Stack遍历方式总结
C语言,输入一个10以内的随机数,按要求求得表达式的值。
GO 使用 Protobuf实用指南
Heap series _0x03: heap block + malloc/new bottom layer + LFH (WinDbg analysis)
7.25-7.29学习总结(状态机及PWM原理)
GStreamer应用开发手册学习笔记之二
Makefile通用模板
【Postgraduate Work Weekly】(Week 5)
Zip包的读取与写入