fork函数小解

学了好久终于搞懂fork函数的一些作用

1. fork函数作用:用于创建新的子进程

这是fork最根本的功能,在父进程里创建新的子进程、

但是创建新的子进程之后呢?

子进程和父进程的关系是什么样的?

为什么fork得到的子进程返回值为0,父进程得到的返回值是子进程pid?

以及多级fork函数调用,得到曾曾……曾孙子进程返回的pid是多少呢?

2. 继承父进程的一切

调用fork函数之后,父进程会创建一个几乎一模一样的子进程出来

几乎一模一样是什么意思?

  1. 子进程的代码和父进程完全相同
  2. 子进程的变量以及变量的值和父进程完全相同,包括全局变量,局部变量都相同,但是唯一的不同就是fork()函数的返回值不同,如果用一个变量接受fork函数返回值,那么父子进程这个变量的值就会不同
    1. 比如:父进程执行fork函数创建子进程,这个fork函数在父进程里返回的是子进程的 PID; 在子进程里返回的是 0
    2. 这是为了区分父子,因为他们完全一模一样的话操作系统也不知道谁是爹谁是儿了,就不方便管理,仅此而已
  3. 执行顺序也相同,子进程会接着父进程的执行顺序继续往下执行,也就是接着执行父进程执行fork()创建自己之后的代码,要注意的是如果子进程是在父进程的分支创建,那么子进程也就只能接着这个分支继续执行,也就是说,子进程和父进程执行逻辑一样,不会执行另一个分支,后面我们有题目讲解

再次提醒,fork在父进程的返回值是子进程pid,在子进程中返回0

父子关系判断很简单:这个fork函数谁调用的谁就是爹,被创建的儿子接着fork往下执行

3. 子进程创建新的子进程,子子孙孙无穷匮也?

父进程执行fork创建子进程A,子进程A也执行fork创建孙子进程B

我们知道父进程中执行一个fork返回子进程A的pid,且这个fork在子进程A会返回0

那么子进程A执行另一个fork创建孙子进程B,这个fork在子进程A的返回值是什么呢?

答案如下:

子进程A执行fork()创建孙子进程B,该fork在子进程A中返回孙子进程B的pid

那么聪明的你一定知道该fork在孙子进程B中返回值是0

因为子进程A执行fork函数创建孙子进程B,A是B的父亲,所以在中A返回B的PID,在B中返回0

4. 读如下代码,写出执行结果,并描述父子关系

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
​
int main()
{pid_t pid1, pid2, pid3;pid1 = 0, pid2 = 0, pid3 = 0;pid1 = fork();if (pid1 == 0){pid2 = fork();pid3 = fork();}else{pid3 = fork();if (pid3 == 0){pid2 = fork();}if ((pid1 == 0) && (pid2 == 0)){printf("Level 1\n");}if (pid1 != 0){printf("Level 2\n");}if (pid2 != 0){printf("Level 3\n");}if (pid3 != 0){printf("Level 4\n");}}return 0;
}

分析

  1. 父进程创建子进程1,pid1记录fork()返回值,也就是子进程1的pid,这里用pid1代指子进程1

  2. 父进程继续执行,遇到if-else分支,父进程的pid1保存子进程1的pid,不为0,进入else分支

    1. 父进程再次创建子进程2,pid3保存子进程2的pid

    2. 父进程的pid1和pid3不为0,pid2 = 0,故进入if(pid1!=0)和if(pid3!=0)分支,输出Level 2Level 4父进程结束

  3. 子进程1从pid1 = fork()之后开始执行,pid1 = fork返回值0,且子进程1继承父进程的pid2、pid3,所以子进程进入if分支

    1. 子进程创建孙子进程1,pid2 = 孙子进程1的pid,孙子进程还会创建曾孙子进程1

    2. 创建孙子进程2,pid3 = 孙子进程2的pid

    3. 子进程1结束

    4. 孙子进程1和孙子进程2以及曾孙子进程1都在if分支里,不会到else分支去,故不输出

  4. 子进程2从else 分支的第一个fork函数后开始运行,故pid3 = 0 (fork()返回值),继承父进程的 pid1 = 子进程1的pid,pid2 = 0

    1. 进入if(pid3 ==0)分支,创建孙子进程3,pid2 = 孙子进程3的pid

    2. 子进程2进入if(pid1 != 0) 和if(pid2 != 0)分支,分别输出Level 2和Level 3

    3. 子进程2结束

  5. 孙子进程3的pid2 = 0 (fork返回值),继承子进程2的pid1 = 子进程1的pid,pid3 = 0

    1. 进入if(pid1 != 0)分支,输出Level 2

故答案为:

Level 2
Level 4
Level 2
Level 3
Level 2

执行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv(C++) 变换图像与形态学操作

文章目录 使用腐蚀和膨胀图像形态滤波器实现案例使用形态学滤波器对图像进行开运算和闭运算实现案例在灰度图像上应用形态学操作算子形态学梯度(Morphological Gradient)黑帽变换(Black-hat Transform)使用分水岭算法进行图像分割使用 MSER 提取显著区域MSER 检测与可视化使…

测试工程师学LangChain之promptTemplate 实战笔记

一、引言:大模型时代的测试自动化革命 2025 年,随着大模型(如 DeepSeek)在自动化测试领域的广泛应用,Prompt 编写已成为测试工程师的核心技能之一。 为什么? 大模型输出的质量 90% 取决于输入的 PromptLangChain 的 PromptTemplate 提供了参数化 Prompt 的标准化方案Ope…

CP2K 软件介绍与使用指南

CP2K 软件介绍与使用指南 一、CP2K简介 CP2K是一款开源的量子化学和固态物理模拟软件包&#xff0c;主要用于原子尺度模拟&#xff0c;特别擅长以下领域&#xff1a; 第一性原理计算&#xff1a;基于密度泛函理论(DFT)的电子结构计算分子动力学(MD)&#xff1a;包括从头算分…

npm、pnpm、yarn使用以及区别

npm 使用 安装包&#xff1a;在项目目录下&#xff0c;npm install <包名> 用于本地安装包到 node_modules 目录&#xff0c;并添加到 package.json 的 dependencies 中&#xff1b;npm install -g <包名> 用于全局安装&#xff0c;适用于命令行工具等。初始化项目…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【六】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

RustDesk 搭建自建服务器并设置服务自启动

目录 0. 介绍 1. 事前准备 1.1 有公网 ip 的云服务器一台 1.2 服务端部署包 1.3 客户端安装包 2. 部署 2.1 服务器环境准备 2.2 上传服务端部署包 2.3 运行 pm2 3. 客户端使用 3.1 安装 3.2 配置 3.2.1 解锁网络设置 3.2.2 ID / 中级服务器 3.3 启动效果 > …

基于Qt封装数据库基本增删改查操作,支持多线程,并实现SQLite数据库单例访问

抽出来的&#xff0c;直接用就行 头文件CPP文件使用示例 头文件 #ifndef DATABASECOMMON_H #define DATABASECOMMON_H/** 单例封装SQLite通用操作&#xff0c;支持多线程调用&#xff1b;可扩展兼容其他数据库&#xff0c;照着SysRunDatabase写&#xff0c;并且重载openDataba…

AI笔记 - 网络模型 - mobileNet

网络模型 mobileNet mobileNet V1网络结构深度可分离卷积空间可分![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 参考 mobileNet V1 网络结构 MobileNetV1可以理解为VGG中的标准卷积层换成深度可分离卷积 可分离卷积主要有…

第十五篇:MySQL 高级实战项目:构建高可用、可观测、性能优化一体化数据库平台

本篇聚焦于如何基于 MySQL 构建一个真正面向生产环境的数据库平台&#xff0c;集成高可用、可观测与性能调优三大核心能力&#xff0c;助力稳定、可扩展的系统运行。 一、项目背景与目标 在实际生产环境中&#xff0c;数据库系统需要应对以下挑战&#xff1a; 业务高速增长带来…

华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《文件目录大小》: 目录 题…

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力 完整可运行代码: import torch import torch.nn.functional as F from transformers

TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.

TIDB创建索引失败&#xff1a;解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时&#xff0c;我们有时会遇到创建索引失败的问题。常见的错误信息为&#xff1a; mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…

华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最少数量线段覆盖/多线段数…

EasyRTC嵌入式音视频实时通话SDK助力AI与IoT智能硬件打造音视频交互多场景应用

一、引言​ 在数字化浪潮下&#xff0c;AI与IoT深度融合重塑智能硬件产业。实时音视频通信是智能硬件交互的核心&#xff0c;其性能关乎用户体验与场景拓展。EasyRTC嵌入式音视频实时通话SDK基于WebRTC技术&#xff0c;以轻量、易扩展的特性&#xff0c;为AI与IoT智能硬件融合…

第十四章 MQTT订阅

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…

Go语言事件总线EventBus本地事件总线系统的完整实现框架

在Go语言中&#xff0c;EventBus是一种非常有用的工具&#xff0c;它通过事件驱动的编程方式&#xff0c;帮助开发者实现组件之间的解耦&#xff0c;提高代码的可维护性和扩展性。 背景 软件架构的发展需求&#xff1a;随着软件系统的规模和复杂度不断增大&#xff0c;传统的紧…

Go语言接口:灵活多态的核心机制

引言 Go语言的接口系统是其​​面向对象编程​​的核心&#xff0c;它摒弃了传统语言的类继承体系&#xff0c;采用独特的​​隐式实现​​和​​鸭子类型​​设计。这种设计使得Go接口既灵活又强大&#xff0c;成为构建松耦合系统的关键工具。本文将深入剖析Go接口的实现机制…