进程的创建——如何理解fork()系统调用

进程的创建

    • 前言
  • 前置知识补充(重要)
    • pid_t 的本质
    • 父进程和子进程
    • exit(0) & break & continue辨析
      • 1. 核心区别对比表
      • 2. 逐个拆解(附代码例子)
        • (1)`exit(0)`:结束“整个程序”
        • (2)`break`:跳出“当前循环/switch”
        • (3)`continue`:跳过“本轮循环剩余代码”
      • 总结
    • 代码初步解读
    • 代码进一步解读(如何理解调用fork返回两次)
    • 深入理解
    • 结语

前言

我们在操作系统中 总是说进程的创建 以及进程的切换等等 但是这个创建到底是怎么实现的呢 这个时候就需要借助fork()系统调用了所谓的系统调用无非是操作系统给我们用户提供的接口 使得我们能够请求操作系统的帮助去执行一些用户态下执行不了的特权指令等等
但是 在真正学习这个之前 我需要对于一些前置知识做出补充 这些都是我自己在学习的时候遇到的困惑 希望能帮到各位

  • 参考教材:【CSAPP-深入理解计算机系统】

前置知识补充(重要)

pid_t 的本质

  • 我先把我们本文需要重点理解的代码贴在下面 大家可以先看一下
  • 下面这段代码就是C 语言中利用 fork() 创建进程的经典示例,其核心是理解父子进程的内存空间独立这个关键点
  • 但是劳资看这个main函数怎么看怎么不对 到底哪不对呢 原来是pid这个变量类型我不清楚到底是什么东西
  • 于是就有了下文的解释:其实pid_t 不是 C 语言的内置类型(比如 int/long),而是操作系统(Linux/Unix)在头文件中定义的 “类型别名”,目的是统一表示 “进程 ID”。它的实际底层类型通常是 int 或 long
  • 简单说:pid_t 就是 “进程 ID 的专属类型”,本质是整数,只是系统给它起了个更专业的名字~
  • 一般来说这种经典教材上的这个变量名可不是乱取的 所以我们完全可以从英文全称的角度来理解 pid—— Process ID

父进程和子进程

  • 先建立直观认知:父进程 vs 子进程(生活比喻)
  • 你可以把进程理解为 “正在运行的程序”,就像一个正在工作的员工:
  • 父进程:相当于公司里的 “老员工”,它主动发起指令,创建出一个 “新员工”
  • 子进程:就是这个 “新员工”,它从老员工那里复制了一模一样的 “工作资料”(代码、变量、内存数据等),但拿到资料后,两人的工作是独立的 —— 新员工改自己的资料,不会影响老员工的,反之亦然。

exit(0) & break & continue辨析

你想弄清楚exit(0)continuebreak的区别,核心可以先记住:这三个都是用来“终止/跳过执行流程”的,但作用的范围、层级、效果完全不同——exit(0)是“结束整个程序”,break是“跳出当前循环/分支”,continue是“跳过本轮循环剩余代码”。

下面用通俗易懂的方式拆解,结合例子让你一眼分清:

1. 核心区别对比表

关键字/函数作用范围核心效果适用场景
exit(0)整个进程/程序直接终止当前运行的整个程序,返回状态码程序完成任务后退出、出错时终止
break当前循环(for/while)或 switch 分支跳出当前所在的循环/switch,执行后续代码满足条件时终止循环/分支
continue当前循环(for/while)跳过本轮循环剩余代码,直接进入下一轮循环满足条件时跳过本轮剩余逻辑

2. 逐个拆解(附代码例子)

(1)exit(0):结束“整个程序”
  • 本质:是一个系统调用函数(需要包含<stdlib.h>),不是关键字;

  • 效果:调用后,当前运行的进程(程序)立刻终止,所有代码都不再执行,0是返回给操作系统的“退出状态码”(表示正常退出);

  • 例子(对应你之前的进程代码):

    #include<stdio.h>#include<stdlib.h>intmain(){printf("程序开始\n");exit(0);// 程序直接终止printf("这段代码永远不会执行\n");// 不会打印return0;}

    运行结果只有程序开始,后面的代码完全不执行。

    补充:在你之前的父子进程代码中,子进程执行exit(0)只会终止子进程本身,父进程不受影响(因为父子进程是独立的)。

(2)break:跳出“当前循环/switch”
  • 本质:C语言关键字;
  • 效果:只能跳出当前所在的一层循环(for/while)或 switch 语句,程序会继续执行循环/switch 之外的代码;
  • 例子:
    #include<stdio.h>intmain(){for(inti=1;i<=5;i++){if(i==3){break;// 跳出整个for循环}printf("i = %d\n",i);}printf("循环结束,程序继续\n");// 会打印return0;}
    运行结果:
    i = 1 i = 2 循环结束,程序继续
(3)continue:跳过“本轮循环剩余代码”
  • 本质:C语言关键字;
  • 效果:不跳出循环,只是跳过当前轮次中continue之后的代码,直接进入下一轮循环的条件判断;
  • 例子:
    #include<stdio.h>intmain(){for(inti=1;i<=5;i++){if(i==3){continue;// 跳过本轮剩余代码,进入下一轮}printf("i = %d\n",i);}printf("循环结束\n");return0;}
    运行结果(缺少i=3):
    i = 1 i = 2 i = 4 i = 5 循环结束

总结

  1. exit(0):终止整个程序/进程,是“最高级”的终止;
  2. break:终止当前循环/switch,程序继续执行后续代码;
  3. continue:跳过本轮循环剩余代码,循环本身继续执行。

代码初步解读

  • 在知道上面这些之后我们再来看这段代码就大概能看出来在做一件什么事情了
  • 首先定义了两个变量pid x 并且将x的初始值置为1 然后用pid用于接收fork()函数的返回值
  • 接下来就是一个if语句 一旦pid=0 那么 就将x+1后 打印出来 child:x= _____; 终止进程
  • 如果没有进入就将x-1之后 再打印parent:x=_____ ;终止进程
  • 主要就是++x以及x++的区别
  • 这个时候我自己就非常疑惑 为什么会终止两次呢 这个时候就需要理解我们的fork()系统调用到底做了一件什么事情

代码进一步解读(如何理解调用fork返回两次)

  • 通常来说 调用一次函数只会返回一次 但是调用fork()确确实实的是会返回两次的
  • 一次是返回到父进程 一次是返回到新创建的子进程

  • 上面这张图片的右上角 就是我们执行输出的最终结果 这时候出现了一种奇怪的现象 为什么会打印出来两个结果呢 这本质上和上面为什么要终止两次进程是一个道理
  • 我们可以通过右下角的流程图得到答案
  • 对应在代码中:
  • 我们可以将main函数认为是父进程 在父进程中我们通过调用fork()创建出子进程 返回值为0
  • 执行 main() 函数的初始进程就是父进程,它的 x=1;
    调用 fork() 后,系统复制出一个子进程,子进程一开始也有 x=1(复制父进程的);
    子进程执行 ++x 把自己的 x 改成 2,父进程执行 --x 把自己的 x 改成 0,两者互不干扰。

深入理解

  • 总的来说 我们必须要明白的是 父进程和子进程是独立的进程 都有自己的私有地址空间 执行互不干扰
  • 并且这个时候我们就完全可以理解:为什么会有两个输出结果 其原因就是父进程调用fork()函数时 标准输出文件是打开的 而子进程继承了父进程所有打开的文件

结语

玛德 有种就放我进复试 球球 真没招了 本想抄个底 现在还真不知道到底是抄底还是抄顶 O(∩_∩)O哈哈~

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

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

相关文章

互斥信号量详解

互斥信号量是一种特殊的二值信号量&#xff0c;专为保护共享资源设计&#xff0c;通过优先级继承机制有效防止优先级翻转问题&#xff0c;确保高优先级任务能及时获取资源。一、互斥信号量的核心概念基本定义互斥信号量&#xff08;Mutex&#xff09;是一种特殊的二值信号量&am…

进程的创建——彻底搞懂fork()的好兄弟 execve()

exec&#xff08;&#xff09;前言结语前言 上一篇文章我们介绍了fork&#xff08;&#xff09;系统调用 但实际上程序在加载以及运行的过程中还需要搭配execve函数核心结论先记住&#xff1a;exec() 的作用是 “替换当前进程的代码和数据”&#xff08;让一个进程执行全新的程…

视频太大发不出去?教你3招“无损”压缩,内存省一半,画质不打折!

现在的手机摄像头越来越卷&#xff0c;动不动就是4K 60帧、杜比视界录制。视频拍出来是清晰了&#xff0c;但副作用也很明显&#xff1a;体积太大了&#xff01;录个几分钟的Vlog&#xff0c;文件大小直接飙到1GB甚至更多。不仅手机内存分分钟告急&#xff0c;想通过微信发给朋…

别只盯着To C了!李开复最新预言:AI Agent的终极战场在To B,搞错方向就完了!

历经2025年一整年的飞速发展&#xff0c;AI Agent在B端的价值早已突破“降本增效”的浅层定位&#xff0c;进入驱动企业业务增长的阶段。 零一万物创始人兼CEO李开复总结&#xff0c;零一万物2025年的核心打法&#xff0c;就是聚焦少数“灯塔型”大客户做深度合作&#xff0c;…

队列集详解

队列集&#xff08;Queue Set&#xff09;是FreeRTOS中用于统一管理多个队列和信号量的关键数据结构&#xff0c;它允许任务通过单一API调用同时监听多个通信对象&#xff0c;显著提升多源数据处理效率和系统实时性。一、队列集的核心概念1. 基本定义队列集是FreeRTOS特有的数据…

【数据库】时序数据智能基座:Apache IoTDB 选型与深度实践指南

引言&#xff1a;时序数据处理的新范式 随着工业4.0、智能制造和能源互联网的快速发展&#xff0c;企业面临海量设备产生的高并发、高频率时序数据处理难题。传统架构中“采集—存储—导出—分析”的链路存在数据迁移成本高、实时性差、系统耦合复杂等问题。 Apache IoTDB 作…

别再挨个翻了!今日 arXiv 精选:多模态大模型+图像生成篇,一张海报看懂未来!

AI论文热榜为您每日精选arXiv优秀论文&#xff0c;用LLM总结成学术海报&#xff0c;一图一览全文。 本篇包含&#xff1a;多模态大模型&#xff08;视觉基础模型 开放词汇&#xff09;&#xff0c;图像和视频生成。那么&#xff0c;如何系统的去学习大模型LLM&#xff1f; 作为…

更新:2025年5月-企业互联网数据中心相关数据

1、数据简介 在数字化转型加速推进的背景下&#xff0c;算力作为新型生产力的核心要素&#xff0c;其部署与利用效率成为衡量企业竞争力的重要指标。许诺等学者&#xff08;2025&#xff09;聚焦于算力部署领域&#xff0c;开展了深入细致的研究&#xff0c;并将研究成果发表于…

导师推荐9个AI论文写作软件,自考毕业论文轻松搞定!

导师推荐9个AI论文写作软件&#xff0c;自考毕业论文轻松搞定&#xff01; AI 工具助力论文写作&#xff0c;轻松应对自考挑战 在当今快速发展的学术环境中&#xff0c;自考学生面临着越来越多的写作压力。从选题到撰写&#xff0c;再到查重和修改&#xff0c;每一个环节都可能…

漏洞扫描工具深度对比:Burp Suite vs. ZAP

一、工具定位与背景核心解析 1.1 Burp Suite&#xff1a;企业级Web安全审计标杆 开发背景&#xff1a;PortSwigger公司推出的商业化渗透测试套件&#xff08;2003年至今&#xff09; 市场定位&#xff1a;专业安全团队的全生命周期Web应用安全解决方案 代表用户&#xff1a;…

如何实施DevSecOps中的安全测试?

一、核心结论&#xff1a;安全测试不再是“事后检查”&#xff0c;而是质量左移的主动引擎‌ 在DevSecOps中&#xff0c;安全测试的本质是‌将安全控制点嵌入CI/CD流水线的每一个关键节点‌&#xff0c;由测试工程师主导或深度参与自动化扫描、缺陷闭环与质量门禁建设。其成功…

2026 网络安全行业深度解读:行业前景、入门路线与系统学习手册

一、行业发展现状&#xff1a;风口上的黄金赛道 2025 年的网络安全行业已从 “被动防御” 迈入 “主动对抗” 的全新阶段&#xff0c;三大核心驱动力让行业持续保持高速增长。 政策层面&#xff0c;《网络安全法》《数据安全法》的刚性约束下&#xff0c;从政务、金融到医疗、…

【AI背景下后端程序员】核心综合能力、基础技术、AI适配、工程化架构、数据处理、软技能

文章目录目录引言一、基础技术能力&#xff1a;AI场景的“地基”二、AI核心适配能力&#xff1a;对接AI技术的“桥梁”三、工程化与架构能力&#xff1a;AI系统的“骨架”四、数据处理与存储能力&#xff1a;AI场景的“血液”五、软技能与协作能力&#xff1a;跨域落地的“润滑…

vscode修改背景颜色为白色或者黑色-简单

最近想设置vscode的背景颜色&#xff0c;搜索了一堆教程&#xff0c;叫设置一堆英文东西。其实没那么复杂&#xff0c;就按下CtrlK &#xff0c;然后再按下CtrlT就可以了&#xff0c;就会弹出选项来选择

‌渗透测试入门到精通

一、核心结论&#xff1a;你已具备渗透测试的基因‌作为软件测试从业者&#xff0c;你无需从零开始学习渗透测试——你‌早已站在起跑线上‌。 你熟悉HTTP协议、API交互、参数传递、响应验证、自动化脚本、CI/CD流水线、测试用例设计——这些正是渗透测试的‌底层语言‌。 渗透…

AI 终于有了“人眼”?达摩院 NeurIPS’25 重磅:第一视角下的动态时空认知,大模型能打几分?

引言 在厨房手忙脚乱时&#xff0c;你问AI助手&#xff1a;“我煮的菜熟了吗&#xff1f;”——它却连已经煮了几分钟都记不得。现有多模态大模型&#xff08;MLLMs&#xff09;在动态第一视角场景中近乎“盲人”&#xff1a;认不出已经清洗过的碗&#xff1b;预测不了即将烧焦…

CTF 新手想入门上分?抓好这几个关键点就够了

CTF新手想入门拿分&#xff1f;吃透这几点 一、先搞懂&#xff1a;CTF 到底是啥&#xff1f;网安人为啥必须练&#xff1f; 很多新手问我&#xff0c;CTF不就是个比赛吗&#xff1f;没必要非得学&#xff1f;这话可就错了&#xff01;CTF全称 Capture The Flag&#xff0c;就是…

【AI革命】一个模型顶仨!80亿参数Omni实现文本、图像、音频统一处理,大模型开发新思路!

在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为理解和生成文本的利器。然而&#xff0c;我们生活的世界本质上是多模态的——信息不仅通过文字传递&#xff0c;还通过图像、声音等多种媒介呈现。让AI同时理解并生成文字、图片和语音&#x…

【MATLAB例程】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,附MATLAB代码下载链接

文章目录程序介绍运行结果MATLAB源代码程序介绍 程序为UAV 辅助 UGV 的二维协同定位仿真框架&#xff0c;用于验证在低精度GNSS条件下空地协同的定位效果&#xff0c;引入空中平台&#xff08;UAV&#xff09;测距测角信息&#xff0c;对地面移动载体&#xff08;UGV&#xff…

基于Cruise2019版及Matlab2018a的燃料电池功率跟随仿真模型探究及实践

燃料电池功率跟随cruise仿真模型&#xff01;&#xff01;&#xff01;此模型基于Cruise2019版及Matlab2018a搭建调试而成&#xff0c;跟随效果很好&#xff0c;任务仿真结束起始soc几乎相同。 控制模型主要包括燃料堆控制、DCDC控制、驱动力控制、再生制动控制、机械制动等模块…