Linux进程:fork函数深度剖析

目录

    

  一、初识fork函数

二、fork函数的返回值

三、fork之后,父子进程谁先运行

四、fork的使用示例


    

  一、初识fork函数

        在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

进程调用fork,当控制转移到内核中的fork代码后,内核会做以下的事情:

(1)分配新的内存块和内核数据结(pcb)构给子进程
(2)将父进程部分数据结构(pcb)内容拷贝至子进程
(3)添加子进程到系统进程列表(运行队列,阻塞队列等)当中
(4)fork返回,开始调度器调度

当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序。

int main( void )
{
pid_t pid;
printf("Before: pid is %d\n", getpid());
if ( (pid=fork()) == -1 )perror("fork()"),exit(1);
printf("After:pid is %d, fork return %d\n", getpid(), pid);
sleep(1);
return 0;
}
运行结果:
[root@localhost linux]# ./a.out
Before: pid is 43676
After:pid is 43676, fork return 43677
After:pid is 43677, fork return 0

这里看到了三行输出,一行before,两行after。进程43676先打印before消息,然后它有打印after。另一个after消息有43677打印的。注意到进程43677没有打印before,为什么呢?如下图所示:

所以,fork之前父进程独立执行,fork之后,(每一个进程的pcb中都会保存一个指针,他指向这个程序运行到了哪一步,即父子进程的指针此时都在fork后面)父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。

二、fork函数的返回值

       (1) 子进程返回0,
        (2)父进程返回的是子进程的pid。

为什么一个fork函数会两个不同的返回值,因为return也是代码,父子进程都需要返回一个值。这里我们说原本父子进程的代码和数据是共用的,只有pcb是独立的,但是由于父子进程现在都需要返回一个值,所以会采取写时拷贝的策略,让子进程中也有一份单独的pid变量。写时拷贝是在子进程需要修改变量的时候,才会给子进程单独创建一份,如果子进程不修改,则和父进程使用同一份代码和数据,由此提高了效率。

写时拷贝概念图:

三、fork之后,父子进程谁先运行

        我们所有的体系结构都是依赖的冯诺依曼结构,父子进程的存在正是因为他们有了不同的pcb,其中保存了各自的信息(如pid,ppid,队列指针等),而每一个进程在运行的时候,其实都会被调度到运行队列中,即队列指针链入到了运行队列里面,在等待某些资源的时候,也会被链入该资源的阻塞队列中,所以进程的状态是在不断变化的。

        父子进程谁先运行,其实是操作系统先把谁链入到运行队列中,这个是不确定的行为。

四、fork的使用示例

        fork会给父进程返回子进程的pid,给子进程返回0,所以我们用这个就能区分父子进程,从而使用if else语句来让父子进程执行不同的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549109.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Apache POI快速入门

介绍 Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI都是用于操作 Excel 文件。 Apache POI的主要组件包括: HS…

监控易监测对象及指标之:全面监控Sybase_New数据库

随着企业数据量的不断增长和业务的复杂化,数据库的稳定性和性能成为了保障业务连续性的关键因素。Sybase_New数据库作为众多企业选择的数据管理解决方案,其稳定性和性能对于企业的运营至关重要。 为了确保Sybase_New数据库的稳定运行和高效性能&#xff…

单体到微服务架构服务演化过程

架构服务化 聊聊从单体到微服务架构服务演化过程 单体分层架构 在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包到单个巨石型(Monolith)应用中,譬如很多企业的 Java 应用程序打包为 war 包,最终会形…

基于vue框架的刺梨销售管理系统pgl49(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,刺梨分类,刺梨产品,刺梨新闻 开题报告内容 基于Vue框架的刺梨销售管理系统开题报告 一、引言 随着现代农业的快速发展和消费者对健康食品需求的日益增长,刺梨这一富含营养价值的水果逐渐受到市场的青睐。然而&#x…

学习Python的难点分析

一、语法灵活性带来的困惑 缩进规则 Python使用缩进来表示代码块,而不是像其他编程语言(如C或Java)使用大括号。这虽然使代码看起来简洁,但对于初学者来说可能会造成困扰。例如: if True:print("This is insid…

网站建设中,营销型网站与普通网站有什么区别

营销型网站与普通网站在建站目的、交互设计以及结构优化等方面存在区别。以下是具体分析: 建站目的 营销型网站:以销售和转化为主要目标,通过专业的市场分析和策划来吸引潜在客户,并促使其采取购买行动。普通网站:通常…

零基础学Servlet

零基础学Servlet 一。介绍: servlet是一种比较古老的编写网站的方式,在2010年之前比较流行,在此之后,有一堆大佬创造了Spring(一种框架),Spring是针对Servlet进行进一步封装,从而让…

OpenSource - 开源日历库tui.calendar

文章目录 强大且灵活的开源日历库推荐:tui.calendar多视图支持: Monthly, Weekly, Daily and Various View Types支持拖拽: Dragging and Resizing a Schedule事件管理支持多语言集成与扩展高度定制化其他功能地址总结 强大且灵活的开源日历库推荐&#…

关于Chrome浏览器F12调试,显示未连接到互联网的问题

情况说明 最近笔者更新下电脑的Chrome浏览器,在调试前端代码的时候,遇到下面一个情况: 发现打开调试面板后,页面上显示未连接到互联网,但实际电脑网络是没有问题的,关闭调试面板后,网页又能正…

防砸安全鞋这样挑,舒适又安心!

在复杂多变的工作环境中,安全始终放在首位,特别是对于那些在工地、车间等危险环境中工作的朋友们来说,一双好的防砸安全鞋无疑是工作中的“守护神”。然而,市面上的防砸安全鞋种类繁多,如何挑选一双既舒适又安心的鞋子…

汇川技术即将在工博会发布类博途全集成自动化平台,德国研发中心功不可没,投资数亿打造工业利器

在即将拉开帷幕的9月中国工博会上,汇川技术将向世界展示其自主研发的全新成果——IFA,一个全集成、全场景覆盖的工厂自动化软件平台。这一平台的发布,不仅标志着汇川技术在工业自动化领域的又一里程碑式突破,更彰显了其与国际工业…

VS code Jupyter notebook 导入文件目录问题

VS code Jupyter notebook 导入文件目录问题 引言正文引言 这几天被 VS code 中 Jupyter Notebook 中的文件导入折磨的死去活来。这里特来说明一下放置于不同文件夹下的模块该如何被导入。 正文 首先,我们需要按下 Ctrl + , 键打开设置,然后搜索 notebook file root。在如…

五.海量数据实时分析-FlinkCDC+DorisConnector实现数据的全量增量同步

前言 前面四篇文字都在学习Doris的理论知识,也是比较枯燥,当然Doris的理论知识还很多,我们后面慢慢学,本篇文章我们尝试使用SpringBoot来整合Doris完成基本的CRUD。 由于 Doris 高度兼容 Mysql 协议,两者在 SQL 语法…

G2O (General Graph Optimization)

前言 以高翔的《视觉SLAM14讲》中的 g2o 拟合曲线为例&#xff0c;讲解 g2o 的使用。源文件为 g2oCurveFitting.cpp。 #include <iostream> #include <g2o/core/g2o_core_api.h> #include <g2o/core/base_vertex.h> #include <g2o/core/base_unary_edge.…

一文读懂:监督式微调(SFT)

监督式微调 (Supervised fine-tuning)&#xff0c;也就是SFT&#xff0c;就是拿一个已经学了不少东西的大型语言模型&#xff0c;然后用一些特定的、已经标记好的数据来教它怎么更好地完成某个特定的任务。就好比你已经学会了做饭&#xff0c;但是要特别学会怎么做川菜&#xf…

计算机网络的整体认识---网络协议,网络传输过程

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起;所谓 "局域网" 和 "广域网" 只是一个相…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

如何调整云桌面安装的虚拟机分辨率?

如何调整云桌面安装的虚拟机分辨率&#xff1f; 1. 编辑GRUB配置文件2. 修改分辨率3. 更新GRUB4. 重启虚拟机 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在云桌面环境中&#xff0c;虚拟机分辨率过低且无法调整时&#xff0c;可以通过以…

【React】react项目中的redux使用

1. store目录结构设计 2. react组件中使用store中的数据——useSelector 3. react组件中修改store中的数据——useDispatch 4. 示例 react-basic\src\store\moduels\counterStore.js import { createSlice } from reduxjs/toolkitconst counterStore createSlice({name: cou…