完整教程:Linux----进程控制

news/2025/11/28 10:54:53/文章来源:https://www.cnblogs.com/gccbuaa/p/19281108

进程终止

函数的返回值是做什么用的。函数返回值允许是return,或者exit():

可以用echo打印最近一个进程的退出码,当然也可以手动其他的值。

其实是子进程返回给父进程的退出码,用于处理子进程。

一个函数,执行完毕,结果正确,返回0;

执行完毕,结果错误,返回其他值,让程序员知道哪里出错了,允许手动设置错误信息

函数出现异常,没有执行完,给父进程传信号。

C语言中有strerror可以查看错误信息:

这是C语言数字对应错误的信息。

ll指令其实也是程序,当找不存在记录时就会报错,与2对应。ll就是用C语言写的。

return、exit()、_exit()的区别

通过return与exit()都能够为函数返回值:

但其实,exit()会引起当前进程的终止,如果不在main函数中写,而是在其中的任意一个函数写就会终止,不再执行下面的软件:

接下来说一说exit()与_exit()的区别,最大的区别就是_exit()是系统调用,执行进程直接中止,不会刷新缓冲区的内容,而exit()作为库中的函数,会刷新缓冲区的内容后,再终止进程:

而_exit():

所以缓冲区肯定不能在虚拟内存中的内核区部分,否则操作系统在终止一个进程肯定不会浪费这么一块资源。

都可以为函数返回值,但是exit()会直接终止进程,_exit()是系统调用,不会刷新缓冲区中的数据。

出现异常时

当进程出现异常时,会将发信号给父进程。如下都是异常的信号,可以使用kill指令让指定进程出现对应的异常

比如:

浮点数异常

进程等待

进程等待是通过系统调用wait/waitpid,来进行对子进程状态检测与回收的的功能。

解决僵尸进程

之前在进程状态时说过,僵尸进程不能使用kill或者ctrl+c杀死,只能利用进程等待来杀掉他,进而解决内存泄露问题。先看看僵尸进程是如何产生的:

允许利用wait()回收子进程资源:

创建多个子进程,并且回收资源:

要是子进程一直不结束,那么wait会使父进程阻塞,如果子进程结束,那么可能回收子进程资源。

退出信息

经过进程等待,获得子进程的退出情况,给子进程布置的任务他完毕的怎么样了。

waitpid

这里要用到waitpid:

说明:如果pid参数为-1,效果与wait一致,可以等待任何进程;

pid>0,那么会等待对应id的进程就是要

status为一个输出型参数,怎么理解呢?前面说了进程退出的三种情况:1.正常退出,结果正确;2.正常退出,结果错误;3.出现异常。

那么父进程在接收子进程信息时,就希望知道子进程是否出现异常,出现什么异常?子进程正常退出的话,结果是否正确?如不正确,出现什么错误了?因而在这种情况下,需要将这些信息写在status中。

status格式

可能看一个例子:

子进程退出1,返回的是256,其实就是2的8次方,就是status的第9个位置为1,子进程的退出码给到了status对应的位置。退出码、异常信号对应的值是多少,就填到上面图中对应的位置。

再看一个例子:浮点数错误,返回异常信号

宏信息

还可以利用宏函数来获取退出信息:

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

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

返回状态为0,也就是假,有异常。

waitpid返回值

参数中的id的进程。就是waitpid正常时,返回等待进程的pid,不正常时,会返回-1,当且仅当它接收的进程不

waitpid中第三个参数为WNOHANG时,父进程执行到waitpid时,要是子进程还没有结束,直接退出返回0,不会再阻塞等待子进程;而当其为0时,会阻塞等待子进程。

给子进程睡5秒,让父进程快些执行:

父进程没有阻塞等待子进程,先退出了,而子进程称为孤儿进程,父亲变成了init,执行达成后后被处理。

非阻塞轮询访问

要是大家希望用非阻塞的方式等待子进程呢?可以用到非阻塞轮询访问:不等待结果、主动反复检查状态的一种工作方式。可以用循环+WNOHANG来实现:

进程程序替换

可以使用以下库函数进行程序替换:接下来会给出用法以及原理

单进程程序替换

举一个例子,许可看到在该进程中,并没有打印code end,而是打印code begin后执行了ls程序。这就是程序替换

原理

当进程调用一种exec函数时,该进程的用户空间代码和信息完全被新程序替换(原进程的代码、堆、栈、素材段都被覆盖),从新程序的入口函数开始执行,不会从原 main() 继续执行。调用exec并不创建新进程,因此调用exec前后该进程的id并未改变(如进程号、父进程号、文件描述符表(可选保留)

多进程程序替换

能够看到在子进程内进行程序替换,并不会影响父进程的运行。因为进程间的独立性,子进程发生覆盖时,进行写时拷贝。

exec函数介绍

其中,第一个参数为path的,都是要给出命令(程序)所在的具体路径的,而file直接给出程序名就可以,他自己会去PATH中找对应的程序名;第二个参数一般都是如何执行命令的参数,比如*arg,....,这个是可变参数,可以带很多命令的选项,如果是argv,那么要将命令都写在这个数组中,注意,最后一个参数必须是NULL;有第三个参数的函数,能够所替换的脚本传入对应的环境变量。

execl和execlp

可以使用其替换成自己写的程序

与之前ls的path不同,这里给出ls指令的名字就许可成功执行

execv和execvp

注意,参数数组要以nullptr为结尾。两个的区别与上面类似,第一个传入参数。

execle

该函数可以为替换程序传递,在讲该函数之前,大家起初要清楚,即使我们不使用这个函数为替换代码传递环境变量,它自己也会继承父进程的环境变量:

隐式传环境变量

可以看到,project成功打印了父进程的环境变量,在这里大家使用了putenv函数为替换进程添加了一个环境变量BROTHER,这个环境变量在父进程中是没有的。为什么替换的程序会有父进程的环境变量呢?存在用户虚拟空间中的就是因为之前说过,进程的命令行参数与环境变量

而进程应用替换只替换栈堆材料段和代码段的内容,不会替换别的内容,所以该程序依然存储着父进程的环境变量!

显式传环境变量

如果非要为替换进程传递环境变量呢?可以使用execle函数和environ变量。environ是一个全局变量指针,在所有采用 C/C++ 的进程中都存在。它保存了当前进程的环境变量表

还可以自己定义环境变量,覆盖父进程环境变量:

environ

environ 是一个全局变量,保存当前进程的环境变量表(即 char **environ,指向一个以 NULL 结尾的字符串数组,每个元素形如 "KEY=VALUE")。我们可以通过它访问或修改环境变量,比如查看 PATH 或设置自定义变量。

在 C 程序中使用 environ 时,通常要加上extern char **environ;这是因为 environ 不是在当前源文件里定义的变量,而是在系统的 C 运行库(如 glibc)中定义的。extern 告诉编译器:“这个变量在别的地方定义,我这里只是引用它”。否则编译器会以为你要重新定义一个 environ,导致链接错误或与系统变量冲突。

总结

l(list)表示参数采用列表
v(vector)参数用数组
p(path)有p自动搜索环境变量PATH
e(env)表示自己维护环境变量

只有execve是真正的系统调用,其它五个函数最终都调用 execve。

调用其他语言

可以启用exec调用其他语言进程,如脚本:

还有python:

之所以可以使用 exec 调用由其他语言编写的程序,是因为 exec 本质上是在操纵进程:它让当前进程的应用内容被新的可执行文件替换,而不是创建新进程。
只要目标程序能够被编译或解释为可执行文件,在操作系统中能以进程形式运行,就可以被 exec 加载执行。

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

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

相关文章

2025年热门的冲床送料机厂家推荐及采购指南

2025年热门的冲床送料机厂家推荐及采购指南行业背景与市场趋势随着制造业的持续升级和自动化水平的不断提高,冲床送料机作为冲压自动化生产线中的关键设备,市场需求呈现稳定增长态势。2024-2025年,全球冲床送料机市…

提高组模拟赛 50 B. 种树 洛谷 P9836 种树 题解

提高组模拟赛 50 B. 种树 题解 原题 题目中的 \(p_i\) 在下文为避免歧义均称为 \(a_i\)。 \(a_i\) 和 \(w\) 都可以拆为质因数的形式来处理,即: \[w=\prod p_k^{c_k} \]对于因数个数,有公式 \[sum=\prod_{i=1}^k (c…

【转载】从一个面试官的角度谈软件工程师的面试

一、概要 本篇文章主要向大家分享,作为项目经理面试别人的经验。大概从面试官的角度向家分析,心理,标准(每个面试官的标准都不一样但是都差不太多)等等。年底向大家分享一波之后,方便明年开年找工作或年底换工作…

望都县农村自建房找谁好?河北保定望都县自建房公司/机构深度评测口碑推荐榜

望都县农村自建房找谁好?河北保定望都县自建房公司/机构深度评测口碑推荐榜 一、引言 十年前,望都县农村盖房还停留在“找本村工匠、画简易草图”的粗放模式。作为华北平原上的农业县,从县城周边的砖瓦房到乡村的土…

NOIP 2025 邮急

enouaipiday -1 本来要打的模拟赛没了,好耶ヽ(✿゚▽゚)ノ 好紧张好紧张 day 0 咕咕咕与你的日常,便是奇迹

2025年口碑好的防火净化板厂家最新推荐权威榜

2025年口碑好的防火净化板厂家推荐权威榜行业背景与市场趋势随着我国工业制造水平的不断提升和安全生产意识的日益增强,防火净化板作为工业厂房、医药车间、电子无尘室等场所的关键建材,市场需求持续增长。2024年数据…

2025年比较好的钩针纸布/棉麻纸布厂家最新热销排行

2025年比较好的钩针纸布/棉麻纸布厂家热销排行行业背景与市场趋势随着手工DIY文化的兴起和环保理念的普及,钩针纸布和棉麻纸布市场近年来呈现出蓬勃发展的态势。2025年,这一细分领域预计将保持15%以上的年增长率,成…

【首选】PDF转视频教程:20秒一键将PDF转换为视频软件

一、背景介绍 大家好,我是王哪跑,现在很多做小学初中高中学习资料相关的教师或出售虚拟资料的网赚达人,都会将PDF电子档转换为视频,并发布到对应的短视频平台进行引流变现,但是使用传统的视频剪辑软件,花费的时间…

2025年靠谱的无尘车间净化门厂家最新热销排行

2025年靠谱的无尘车间净化门厂家热销排行行业背景与市场趋势随着半导体、生物医药、精密电子等高科技产业的快速发展,无尘车间作为保障生产环境洁净度的关键设施,其市场需求呈现爆发式增长。据行业数据显示,2025年全…

【Springer出版 | EI检索】第五届环境污染与治理国际学术会议 (ICEPG 2025)

第五届环境污染与治理国际学术会议(ICEPG 2025)定于2025年12月12日至14日在山东青岛举办。【收录率高,EI稳定检索,青岛理工大学、同济大学联合主办】 **第五届环境污染与治理国际学术会议 (ICEPG 2025) ** 2025 5t…

2025CMDB厂商选型:从全栈纳管到一体化运维,企业级配置管理的核心考量

2025CMDB厂商选型:从全栈纳管到一体化运维,企业级配置管理的核心考量$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");数字化运维中,CMDB平台已升级为运维…

2025年比较好的快速浓缩干燥器/快速真空浓缩干燥器厂家最新权威推荐排行榜

2025年比较好的快速浓缩干燥器/快速真空浓缩干燥器厂家权威推荐排行榜行业背景与市场趋势随着生物医药、食品科学、材料化学等领域的快速发展,快速浓缩干燥器作为实验室和工业生产中的关键设备,其市场需求持续增长。…

2025年口碑好的风机盘管出风箱TOP品牌厂家排行榜

2025年口碑好的风机盘管出风箱TOP品牌厂家排行榜行业背景与市场趋势随着建筑节能要求的不断提高和中央空调系统的广泛应用,风机盘管出风箱作为中央空调末端设备的重要组成部分,其市场需求持续增长。2025年,随着绿色…

阻止 Windows 自动从睡眠中唤醒 - Higurashi

控制面板 -> 硬件和声音 -> 电源选项 -> 更改计划设置 -> 更改高级电源设置 -> 睡眠 -> 允许使用唤醒定时器 -> 禁用。参考:win10 启用休眠总是莫名奇妙唤醒怎么破、阻止 Win 10 自动从睡眠中唤…

2025年比较好的双层恒温 振荡培养箱/水浴恒温振荡培养箱厂家推荐及选购指南

2025年比较好的双层恒温振荡培养箱/水浴恒温振荡培养箱厂家推荐及选购指南行业背景与市场趋势随着生物技术、医药研发和生命科学研究的快速发展,实验室设备市场迎来了持续增长。恒温振荡培养箱作为实验室基础设备之一…

完整教程:微服务高并发设计考虑要点

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月 0.6/1kV 电线电缆厂家推荐,国标电线电缆,阻燃耐火电线电缆,低压电力电缆,优质耐用电缆品牌精选

2025年11月0.6/1kV电线电缆厂家推荐:国标电线电缆、阻燃耐火电线电缆、低压电力电缆、优质耐用电缆品牌精选 行业背景分析 0.6/1kV电线电缆作为低压配电系统的核心组成部分,在建筑、工业、基础设施等领域发挥着不可替…

视觉即品牌:兰亭妙微如何用UI设计讲述您的独特故事

视觉即品牌:兰亭妙微如何用UI设计讲述您的独特故事在用户打开您APP的第一秒,一场无声的视觉沟通就已经开始。色彩、字体、图形、空间——这些视觉元素在用户尚未阅读任何文字、使用任何功能之前,就已经为您的品牌定…

如何在邮件系统中进行多层次的日志审计与日志脱敏

在现代企业中,邮件系统不仅是日常通讯的关键工具,也是业务数据传递和个人隐私的重要载体。因此,如何确保邮件系统中的日志审计与数据保护尤为重要。本文将讨论如何设计一个多层次的日志审计机制,结合不同级别的日志…

linux 指定信任根证书 (OS)

复制证书到系统目录sudo cp xxx_ca.cer /etc/pki/ca-trust/source/anchors/更新证书信任库sudo update-ca-trust extract验证是否已经信任trust list | grep -i "xxx"验证方式:curl https://域名/xxxxx不会…