Linux:进程的创建、终止和等待

linux:进程的创建、终止和等待一、进程创建

1.1 初识fork函数

在调用fork函数后,内核会执行以下操作:

为子进程创建一个PCB结构体,并复制父进程的地址空间和页表(PCB中的指针指向该空间)。子进程和父进程最初共享代码和数据,页表中的虚拟地址和物理地址映射关系相同,因此指向相同的物理空间。fork返回后,子进程被添加到系统的进程列表中,由调度器调用,开启各自的执行路径。一旦父进程或子进程尝试修改数据,写时拷贝机制会启动,分配新的物理内存,并更新页表映射。

Linux:进程的创建、终止和等待1.2 写时拷贝

通常情况下,父子进程共享代码和数据,当没有写入操作时,数据也共享。一旦有写入操作,写时拷贝机制会为写入的进程创建数据副本。

Linux:进程的创建、终止和等待1.3 fork函数的意义

1.4 fork调用失败的原因

系统中已有过多进程。用户的实际进程数超出限制。

二、进程终止

问题引入:为什么main函数要返回0?返回不同数值的意义是什么?

——> 成功只有一种情况,但失败可能有无数种原因和理由!因此,main函数的返回值本质上是告知父进程进程运行的结果。如果失败,可以用不同的数字表示不同的错误原因。

2.1 运行结果不正确

2.2.1 main函数返回

在进程中,谁会关心我的运行情况?——> 父进程!

实际上,main函数本质上也是一个被调用的函数,其返回值是告知父进程自己运行的情况。

2.2.2 退出码概念

父进程可以通过获取子进程的退出码,不同的退出码代表不同的原因。

问题1:为什么需要退出码?遇到问题直接printf错误原因或查看结果不就可以了吗?

——> 没有规定程序必须打印错误信息。例如,错误可能不是通过显示器输出,而是通过网络写入。

问题2:错误码适合计算机查看,但不适合人查看。我们是否可以将其转换为字符串形式的错误信息?

——> strerror函数可以将错误码转换为字符串形式的错误信息。这些退出码本质上就是错误码,由系统提供。

Linux:进程的创建、终止和等待我们可以打印出一些错误码对应的信息。

Linux:进程的创建、终止和等待问题3:我们的退出码使用的是系统提供的错误码体系,我们能否创建自己的退出码体系?

——> 该体系由C标准库提供,但我们编写的代码通常不是纯C代码,因此通常会创建自己的退出码体系。

Linux:进程的创建、终止和等待问题4:为什么父进程要关心子进程的运行状况?

——> 父进程创建子进程的目的是让子进程执行不同的代码流,完成特定任务。父进程本身只是一个执行者,真正关心的是用户,用户需要知道子进程完成任务的情况。

Linux:进程的创建、终止和等待问题5:全局变量errno

——> 保存最后一次执行的错误码。

Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待这种写法可以在进程返回前直接获取错误码,然后将其转换为错误信息打印出来,并且在进程结束后让父进程知道运行情况。

2.2.3 库函数exit

Linux:进程的创建、终止和等待exit和return的区别:在main函数中,exit和return是等价的,因为exit表示退出进程,而main函数执行完return也会退出进程。但在其他函数中,return表示函数返回。

2.2.4 系统调用接口_exit

Linux:进程的创建、终止和等待_exit和exit的区别:_exit是系统调用接口(更底层),exit是库函数。exit最终也会调用_exit,但在调用_exit之前会执行其他操作:

执行通过atexit或on_exit定义的清理函数。关闭所有打开的流,所有的缓存数据均被写入(清理缓存)。调用_exit。

Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待因此,exit比_exit多做了一层重要工作,即刷新缓存。我们还可以得出另一个结论:缓存区绝对不在内核区!——> 因为如果在内核区,系统调用的_exit在终止时也会刷新缓存区。由于现代操作系统不会浪费时间和空间,所以缓存区肯定是由用户区维护的!(_exit看不到缓存区,所以这项工作只能由exit完成)。

2.2 异常中止

使用退出码可以告知父进程执行情况,但如果进程异常中止呢?那连运行完毕都无法完成,更别提结果是否正确。因此,异常是最先需要被检测到的!一旦发生异常,代码通常未能完全执行,即使执行完毕,错误码也无法信任,此时退出码就失去了意义。

举个例子:就像平时考试一样,如果你考得不好,大家会关心你为什么考不好,但如果你作弊了,性质就变了,即使考得再好也让人觉得不可信。

因此,进程结束后应首先判断该进程是否异常,然后才能确定退出码是否可用。

除0错误:

Linux:进程的创建、终止和等待野指针(段错误)

Linux:进程的创建、终止和等待类似除0和野指针这样的错误,会触发一些硬件级别的错误。例如,除0会导致CPU的状态寄存器出现溢出错误,而野指针(访问的虚拟地址在页表中找不到映射或只有只读权限)最终会转换为一些硬件级别的信号,告知操作系统。

因此,父进程需要关心子进程为什么异常,以及发生了何种异常,系统会通过信号告知我们的进程发生了异常。

Linux:进程的创建、终止和等待因此,我们最关键的是要查看父进程是否收到了信号,如果没有收到信号则没有异常(具体如何接收信号涉及到进程等待的知识)。

三、进程等待

3.1 如何理解

3.1.1 是什么

通过系统调用接口wait/waitpid,来对子进程进行状态检查和回收。

3.1.2 为什么

解决内存泄漏问题——> 僵尸进程无法被杀死,必须通过进程等待来回收(必须完成)。通过进程等待获取子进程的退出情况——> 了解子进程完成任务的情况(可以选择)。

3.1.3 怎么做

父进程通过调用wait/waitpid方法来解决僵尸进程回收问题,并获取子进程退出情况。

3.2 wait和waitpid

Linux:进程的创建、终止和等待3.2.1 wait解读

wait:(等待任意一个子进程)

int *status:输出型参数,int会被拆分成几部分使用,不关心可设为NULL。

Linux:进程的创建、终止和等待问题1:父进程等待时,我希望获取子进程的哪些信息?

——> (1)子进程的代码是否异常?(2)没有异常,结果是否正确,不正确的原因是什么?

问题2:为什么父进程不定义全局变量的status,而必须使用wait等系统调用来获取状态?

——> 使用全局变量的话,由于进程具有独立性,子进程如何修改自己的status,父进程都看不到!(虽然表面上是一份代码),所以这个过程必须通过系统调用接口让操作系统帮助我们获取子进程的一些数据!(因为OS不信任任何人)

问题3:为什么int被分为好几个部分?

——> 我们不仅需要知道是否发生异常,还需要知道退出状态,所以这个int需要拆分成bit位。

Linux:进程的创建、终止和等待(1)低7位判断是否异常 status&0x7F

(2)第8位core dump标志

(3)次8位判断退出原因 (status>>8)&0xFF

返回值:成功返回被等待子进程的pid,失败返回-1。

Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待3.2.2 阻塞和非阻塞轮询

Linux:进程的创建、终止和等待如果子进程一直不退出,父进程在调用wait时默认不会返回,处于阻塞状态——> 通过这个我们可以知道阻塞不仅仅发生在向硬件发送请求时等待其状态准备好,还可以发生在父进程等待子进程结束以获取其状态。

如何理解非阻塞轮询?我们讲个小故事:

你还有3天就要C语言考试了,但你不以为然,于是先玩了两天。当第三天时你慌了,因为你平时上课没听而且什么也不懂,所以你找了一个班里的努力型学霸小张(喜欢学习且做了很多笔记)。于是你走到楼下,但你又懒得上去,于是你打电话给小张:“你能不能跟我去图书馆帮我复习几个小时,顺便把笔记借我看看?”小张说:“好,但我现在还有几页笔记没看完,你在楼下等等我,我等会就下去……”然后你就挂了电话。过了5分钟,你发现小张还没下来,于是你又打了电话,但小张还是说等会就下去,就这样你打了十多个电话,终于小张下来了,于是你们开开心心地去往图书馆了。

在这个过程中,你就是用户,打电话的过程就是调用系统调用的过程,而小张就是操作系统。当你打电话询问小张的过程其实就是想操作操作系统询问:“你当前的状态准备好了没有?(检查状态)”小张说等会就下来,于是你挂电话,这其实就是你检查不成功,先结束系统调用(系统调用立即返回),这就是非阻塞!而你一直给小张打电话其实就是轮询(不断询问,有while循环),所以加在一起就是非阻塞轮询!

最后你考过了,你很开心,但数据结构老师又告诉你明天要考试,你又没听,于是你想到了找小张,但历史的经验告诉你肯定得打很多电话,上次手机都打欠费了。于是这次你换了一个思路,在小张告诉你再等会的时候,你就要求他不要挂断电话,直到下楼的时候再挂,这样我可以随时知道你的情况。

这个过程其实就是阻塞!也就是系统调用会卡住,会被链接到子进程的一个阻塞队列中等待。

你又过了,你特别开心,但操作系统明天又要考试了,于是你给小张打电话,但你也不知道小张不会立马下来,所以你自己也带了本书,在等小张的时候自己也不会闲着没事。可以自己看会书。

这个过程描述的就是,阻塞的方式虽然简单且应用较多,但也比较呆,因为父进程在等待的时候什么也干不了。非阻塞轮询相比较于阻塞来说,可以多做一些自己的事情,比如说可以做一些检查的工作!

父进程在非阻塞轮询时可以做什么事,如果这件事任务太重到时没时间等怎么办?

——> 一般来说这种事都是一些比较轻的工作,因为我们核心的任务是等待子进程,所以一般来说都是做一些检查之类的简单任务。

Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待3.2.3 waitpid解读参数:

pid_t pid

-1:等待任意一个子进程,和wait等效

0: 等待那个id和该pid相等的子进程

Linux:进程的创建、终止和等待2. int *status

(1) WIFEXITED(status) : 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)其实等价于status&0x7F

(2) WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)其实等价于(status>>8)&0xFF

(3)NULL:不关心子进程的状态

Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待Linux:进程的创建、终止和等待进程本质上是一个多叉树,父进程只关心自己直系的子进程!

Linux:进程的创建、终止和等待3. int options

0:代表阻塞等待的方式,就是子进程没结束系统调用就一直等

WNOHANG: 代表非阻塞轮询的等待方式,若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。

轮询的话必然要维护一个while循环,然后根据情况去break,不然就可能出现子进程还没结束父进程就挂了的情况。

返回值

当正常返回的时候waitpid返回收集到的子进程的进程ID;

如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

调用出错,比方说等待的不是自己的子进程。

Linux:进程的创建、终止和等待3.2.4 多进程的代码逻辑

如果是多进程的话,waitpid的第一个参数可以用-1,让父进程等待任意一个子进程,然后子进程有多少最好用一个宏,这样父进程可以知道子进程的数目,轮询的时候我们就不能一下子break掉,而是需要维护一个计数器,没等待完一个子进程就去统计一下。

创建很多的子进程,但具体哪个先执行是由调度器决定的,但我们必须知道的就是最后一个结束的必然是父进程,因为子进程都是它创建的,所以它理所应当去回收所有的子进程。

进程最重要的三个核心:进程创建、进程等待、进程终止。所以我们在需要多进程的时候,我们的代码核心首先要考虑以下要素:(1)需要有循环fork创建子进程;(2)需要在合适的时候让子进程退出(常用exit);(3)父进程必须等待子进程(阻塞就是一直卡住等,非阻塞轮询就是得需要一个while循环,反复调用),它有义务回收所有子进程!

Linux:进程的创建、终止和等待

以上就是Linux:进程的创建、终止和等待的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/13409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月22日 11:22:10
iCloud官网怎么设置自定域名_iCloud自定义邮箱域名教程
下一篇 2025年11月22日 11:24:12

相关推荐

  • windows10如何查看S.M.A.R.T.硬盘状态_windows10硬盘S.M.A.R.T.状态查看方法

    电脑运行慢、蓝屏或文件损坏可能是硬盘故障前兆,可通过S.M.A.R.T.技术检测健康状况。1、使用WMIC命令行工具输入“wmic diskdrive get model,status”查看状态,显示Pred Fail需立即备份数据;2、CrystalDiskInfo可深度分析S.M.A.R.T.参…

    2026年9月21日
    100
  • Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能通过智能选择工具与内容感知技术结合,实现高效图片裁剪。首先使用对象选择、快速选择或魔棒工具智能识别主体或背景,再通过“选择并遮住”精细调整边缘,尤其适用于复杂轮廓如发丝。随后可应用图层蒙版透明化背景,并用裁剪工具调整画布范围。结合内容感知填充可移除干扰元素并自动补全画面,内…

    2026年9月21日 用户投稿
    300
  • Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    在web开发中使用mysql存储过程能有效封装逻辑并减少前端负担,本文介绍了其优势、环境配置及实战技巧。一、存储过程的优势包括减少网络传输、提高性能、统一业务逻辑;二、sublime text配置步骤为安装package control、sublimerepl插件、sql语法高亮插件,并建议新建.s…

    2026年9月21日 用户投稿
    800
  • Linux中如何安装Redis_Linux安装Redis服务的完整教程

    安装编译环境和依赖:Ubuntu/Debian用apt安装build-essential tcl wget,CentOS/RHEL用yum安装Development Tools和tcl wget。2. 下载Redis 7.2.4源码包并%ignore_a_1%,进入目录后执行make编译,可选mak…

    2026年9月21日
    000
  • VSCode代码空格怎么解决_VSCode缩进与格式处理教程

    解决VSCode代码空格和缩进问题,需配置settings.json中的缩进规则并引入外部格式化工具。首先设置”editor.tabSize”、”editor.insertSpaces”和”editor.detectIndentation&…

    2026年9月21日
    100
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    000
  • Java中字符到数字转换:解决for循环提前返回的常见陷阱

    本文探讨java中`for`循环在字符到数字转换时,因`return`语句放置不当导致程序提前终止、无法完整处理字符串的问题。我们将分析这种常见陷阱,并提供修正方案,演示如何正确利用循环填充数组,并在循环结束后统一返回最终结果,确保每个字符都能被准确映射和组合。 引言:字符到数字的映射需求 在编程实…

    2026年9月21日
    000
  • 燕云十六声装备回收转流派技巧分享

    燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享

    燕云十六声中,装备是角色变强的关键所在!武器、防具、饰品各具特色,品质更是分为绿、蓝、紫、金四个等级。想要高效提升战力、不浪费培养资源?那就必须掌握装备回收技巧与流派转换策略。具体怎么操作?继续往下看,实用攻略全解析助你轻松上手! 燕云十六声装备回收与转流派技巧指南 一、装备和武学的区别要分清 新手…

    2026年9月21日 用户投稿
    100
  • Linux如何查看网络带宽使用情况

    使用iftop实时查看网络连接带宽,nethogs按进程监控流量,sar查看历史网络统计,vnstat记录长期流量,四者分别适用于实时监控、进程定位、短期统计和长期分析。 在Linux系统中,查看网络带宽使用情况有多种方法,可以通过命令行工具实时监控网络流量和带宽占用。以下是几种常用且实用的方式。 …

    2026年9月21日
    100
  • 梦幻号虚拟主播电商运营宝典(附新手教程+配套工具清单)

    虚拟主播电商的核心在于“内容驱动销售,人设凝聚用户”,要让“梦幻号”真正动起来并实现带货,必须先赋予其鲜明的人设,包括清晰的定位标签(如美食家、科技宅)、独特的人格魅力(性格、口头禅、小缺点)和与产品的强关联性,使其具备辨识度和故事感,从而建立用户信任;接着通过obs studio、vtube st…

    2026年9月21日
    000
  • 软删除(Soft Delete)的实现与恢复逻辑

    使用软删除的原因是它允许数据恢复和保持数据完整性。1) 软删除通过标记数据为已删除而非实际删除,提供了数据恢复的可能性。2) 它保持数据的历史记录,确保数据完整性。实现软删除通常在数据库中添加字段如is_deleted或deleted_at,恢复数据时重置这些字段。 软删除(Soft Delete)…

    2026年9月21日
    000
  • deepseek下载速度优化_从deepseek下载速度优化官网获取

    deepseek下载速度优化入口在官网https://www.deepseek.com,进入后可通过设置调整响应模式、使用智能路由和数据压缩技术提升速度。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ deepseek下载速度优化入口地址在…

    2026年9月21日
    000
  • Linux如何设置目录的执行权限

    目录的执行权限是访问其内容的“钥匙”,使用chmod命令可通过符号或八进制模式设置,常见权限为755(所有者rwx,组和其他用户rx),递归设置时推荐结合find命令分别处理文件和目录,避免误加执行权限。 在Linux中,设置目录的执行权限( x )并非意味着你可以“运行”这个目录,而是赋予了你进入…

    2026年9月21日
    000
  • Java多线程API调用中Future.get()返回null的解决方案

    本文旨在解决%ignore_a_1%api调用中`future.get()`方法返回`null`的常见问题。当使用`callable`和`executorservice`并发执行api请求并尝试获取结果时,如果流读取逻辑不当,可能导致获取到的数据为空。文章将详细解释问题根源,并提供使用`string…

    2026年9月21日
    000
  • VSCode的自动保存功能如何开启?

    在VSCode中开启自动保存需进入“文件”→“首选项”→“设置”,搜索auto save并选择Files: Auto Save模式,可选afterDelay、onFocusChange或onWindowChange,其中afterDelay可设置延迟时间如1000毫秒,启用后状态栏显示保存状态以确认…

    2026年9月21日
    000
  • 升级后如何检查兼容性

    检查兼容性是升级后确保系统稳定的关键,需先确认硬件配置与驱动支持,再验证软件运行及业务流程正常,最后通过系统日志排查潜在错误,逐步排除风险。 系统或软件升级后,检查兼容性是确保各项功能正常运行的关键步骤。直接进入实际使用前,花时间验证兼容性可以避免数据丢失、服务中断等问题。 检查硬件和驱动支持 某些…

    2026年9月21日
    000
  • 小红书零基础赚钱攻略(精准选题+涨粉秘籍+账号运营+高转化变现方法)

    找到自己真正擅长或有热情的领域,结合用户需求和竞争情况确定细分赛道;2. 通过优质内容、高互动数据、精准关键词和话题标签提升曝光;3. 利用品牌合作、带货佣金、知识付费等方式实现变现,核心是建立在信任基础上的持续价值输出,最终将流量转化为实际收益。 小红书零基础赚钱,核心在于找到自己的定位,持续输出…

    2026年9月21日
    000
  • mysql如何排查排序异常

    排查MySQL排序异常需先确认ORDER BY是否生效,检查子查询、UNION及应用层逻辑是否覆盖排序;通过EXPLAIN分析是否使用索引排序,避免Using filesort;确保字段类型、字符集和排序规则(collation)符合预期,处理NULL值和大小写敏感性;关注sort_buffer_s…

    2026年9月21日
    000
  • 即梦AI运镜控制怎么控制_即梦AI视频镜头移动技巧详解

    掌握即梦AI运镜需四步:一、用“镜头缓慢推进”等预设提示词生成标准运动;二、通过动效画板框选主体并绘制运动路径;三、设置首尾帧引导转场,实现穿越或循环效果;四、结合“希区柯克式变焦”“时间冻结环绕”等高级技巧增强视觉表现。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月21日
    000
  • Linux如何检查系统中缺失的依赖库

    使用ldd和readelf检查依赖,通过包管理器安装缺失库。ldd显示not found时,用apt-file或yum provides查找并安装对应软件包,必要时添加库路径至/etc/ld.so.conf并运行ldconfig更新缓存。 在Linux系统中,程序运行时依赖各种共享库(.so文件),…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信