Vfork|学习笔记

简介: 快速学习 Vfork

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频Vfork】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/10995


Vfork

 

进程的创建 vfork 函数

pid t vfork(void)

这个函数没有参数,有一个 pid t 的返回值,和 fork 函数的形式值是一样的。

(1)功能:

vfork 函数和 fork 函数一样都是在己有的进程中创建一个新的进程,但它们创建的子进程是有区别的。

Fork 是创建一个子进程,子进程是父进程的一个复制品,并且父子进程有独立的进程空间,并且以前说过fork创建一个进程后就是俩个独立的进程。

操作系统调用要看操作系统的算法,谁先输出是不一定的。Fork首先就是可以进行的地址复制,第二就是可以有独立的地址空间,第三是操作系统调用不确定。

(2)返回值:

创建子进程成功,则在子进程中返回0,父进程中返回子进程ID。出错则返回 。

−1。

(3)fork和vfork函数的区别:

①vfork保证子进程先运行,在它调用 exec 或 exit 之后,父进程才可能被调度运行。

为了验证上述内容,可以根据之前 fork.c 文件的观察效果。将 vork.c

改名为 vfork.c 打开浏览。

输入 gcc vfork -o  vfork,创建一个进程之后,子进程中挂有的内容,父进程中挂有的内容,此时运行可以看到父子进程是同时进行的,

如下图

image.gif再将里面的内容的 fork 改为 vfork。vfork 是保证子进程显示之前,子进程调用exit 或是 exec 函数父进程才会被执行。如果代码这个样写父进程就会一直是 while(1)。

效果如下,可以看到只有子进程在执行,因为使用了vfork。只有调用 exit 或是 exec函数,父进程才会执行。

image.gif验证:使用exit函数来查看对父进程的作用

需要加入一个对整型变量的定义,语句为int i;同时修改子进程中的while(1)改为for(i=0;i<5;i++);_exit是不用包含其他头文件的不用书写。

这部分语句为:

Int i;

for(i=0;i<5;i++)

{  printf(“this is son process\n”);

sleep(1);

}

_exit(0);

这个循环结束后会调用exit,之后会调用exit进行执行

输入语句gcc vfork.c -o vfork

./vfork

运行结果如下:

子进程调用的5s后发现父进程也被调用执行了

image.gif②vfork和fork一样都创建一个子进程,但它并不将父进程的地址空间完全复制到了进程中,因为调用exec(或exit),于是也就不该访问该地址空间。

vfork的目的一般就是使子进程可以调用exec去启动另外一个新的程序,用新的程序代码替换子进程的代码,所以没有必要复制父进程的代码它会暂时呆在父进程的进程空间,等到exec启动新的进程才回去开辟新的空间。

③相反,在子进程中调用exec或exit之前,它在父进程的地址空间中运行,在exec之后子进程会有自己的进程空间。

这个例子在之前已经验证过了是保证子进程的执行,子进程进行循环之后,再去执行父进程。

验证 vfork 创建子进程与父进程共用一个地址空间

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

int var = 10;

int main(int argc ,char *argv[])

{

pid t pid;

int num =9;

pid=vfork();

if(pid<0)

{  perror(“vfork”);

return 0;

}

else if (pid == 0)

{int i;

var++;

num++;

printf(“in son process var -%d\n”,var,num);

_exit(0);

}else

{

printf(“in father process var -%d\n”,var,num);

}

return 0;

}

注意:

在父进程中不用getsleep,因为只有子进程执行了exit()父进程才会被执行。观察var是否发生变化,如果var变为了11,num变为9,则说明这个子进程加的是父进程的变量

运行结果:

var=11,num=10说明子进程是已经加过了的,就验证了用vfork创建的子进程在exit或exec之前用的是父进程的地址空间。

image.gif

image.gif对于调用_exit,也可以直接调用exit,此时要加入头文件include<stdlib.h>,

运行结果如下:没有问题的。

image.gif但如果在修改为 return 0

结果如下:

就会出现错误,程序一直运行。Return不能使用的原因是由于,vfork创建的共同子进程,在子进程中它是一个父进程的地址空间,子进程中return的就是main函数值。

一般调用函数的时候都会压到栈里面去,函数调用完后return会发生弹栈。一个进程中就一个main函数,压了一次栈,在进程结束的时候就会增加一次,之后又会return一次,相当于一个main函数弹了两次栈,就会发生栈溢出的现象。

栈溢出就可能导致运行效果不太一样。所以一个main函数弹出两次就不行,这是一个地址空间。但如果是fork的话就没有问题,它是两个地址空间各顾各的。

image.gif所以要注意 vfork 的时候不要用 return 进行函数的调用,选择使用_exit或是exit来结束进程。

总之,讲述了两点内容,第一vfork创建子进程的时候保证先运行,当子进程退出了才运行父进程;第二父进程是vfork创建的进程,俩个用的是同一个地址空间,直到exit 之后,才可以有各自的地址空间。

相关文章
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
877 0
深入理解InnoDB索引数据结构和算法
|
机器学习/深度学习 存储 算法
数据结构 | 算法的时间复杂度和空间复杂度【详解】(一)
什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
|
开发框架 .NET C#
C# 一分钟浅谈:第一个 C# 控制台应用程序
【9月更文挑战第1天】C# 是一种现代化的、面向对象的编程语言,广泛应用于桌面应用、Web 应用和游戏开发等领域。本文详细介绍如何创建第一个 C# 控制台应用程序,包括使用 Visual Studio 和 .NET SDK 的步骤,并解析常见问题及其解决方法,如控制台窗口立即关闭、编译错误和运行时错误等。通过实践,你将掌握 C# 控制台应用的基础知识,为进一步学习打下坚实基础。
583 49
|
SQL 存储 JSON
SQL,解析 json
SQL,解析 json
241 8
|
网络协议 程序员 数据库
什么是公网IP和内网IP
【10月更文挑战第27天】公网IP与内网IP是网络通信中的两个重要概念。公网IP是互联网上的唯一标识,而内网IP仅在局域网内部有效,用于局域网内的设备通信。由于IPv4地址资源有限,通常一个公司或家庭只有一个公网IP,内部设备通过NAT(网络地址转换)技术共享该公网IP访问互联网。这样不仅节省了IP资源,还提高了网络安全性和稳定性。
1157 0
|
缓存 Java API
API接口性能优化管理
在数字化时代,API性能优化对于提升软件效率和用户体验至关重要。本文介绍了多种优化方法:配置优化包括调整JVM参数等;代码层面减少重复调用并批量操作数据库;池化技术如线程池和HTTP连接池能有效利用资源;数据库优化通过索引提高查询速度;异步处理则使主流程业务不受阻塞;缓存策略如Redis缓存减少数据库访问;可观测性工具如日志平台和APM帮助监控性能。综合运用这些方法,可根据业务需求持续调整优化,显著提升API性能及用户体验。
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
Kubernetes 负载均衡 API
在k8S中,flannel的作用是什么?
在k8S中,flannel的作用是什么?
|
存储 数据可视化 数据管理
Ganos三维引擎系列(三):BIM数据管理与可视化功能解析
本文介绍了阿里云多模态时空数据库Ganos三维引擎在BIM数据管理中的应用。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型(SFMesh)用于存储带有语义的类BIM精细化三维模型,同时提供了空间索引、分析算子、导入工具、可视化支撑等功能,本文详细介绍表面网格模型应用于IFC格式的BIM数据管理与可视化等功能。
|
数据库
Mybatis-plus 注解 @TableField(exist = false)
@TableField(exist=false)注解加在bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错,返回数据库数据时候字段会被映射
Mybatis-plus 注解 @TableField(exist = false)