初识Linux · 进程替换

目录

前言:

1 直接看代码和现象

2 解释原理

3 将代码改成多进程版本

4 认识所有函数并使用


前言:

由前面的章节学习,我们已经了解了进程状态,进程终止以及进程等待,今天,我们学习进程替换。进程替换我们从如下几个点开始介绍,第一,直接看现象,第二,解释原理,第三,将代码改成多线程版本,第四,使用所有的替换函数,认识参数的含义。

废话不多说,直接进入主题。


1 直接看代码和现象

我们使用一段代码进入到进程替换:

int main()
{printf("test begin...\n");	execl("/usr/bin/ls","-l",NULL);printf("test end...\n");	return 0;
}

根据现象,我们可以看到,第二个printf是没有被执行的,但是第一个被执行了,而我们使用到的函数,叫做进程替换函数,它一共有6种,本质上我们理解了其中的2 - 3个,我们就会使用全部的了。我们不妨使用man手册查看一下:

输入:

man exec

从文档里面我们可以看到进程替换的函数版本有这么多个,每个函数都有返回值,但是呢我们不必在意返回值,因为通过现象,我们看到了执行进程替换函数之后的代码都失效了,所以返回值即使接受了,也没有用处。 

关心的情况只有一种,就是进程替换失败,但是这种情况十分的少见,我们就自然而然的给忽略了。


2 解释原理

首先我们要清楚一个问题,进程替换的全名不是进程替换,替换的不是进程,是程序,所以在进程程序替换的这个过程,本质上是没有创建新的进程的。

第一个点:进程程序替换中是没有创建新进程的,无非是程序替换了PCB里面原来的数据。这里我们不妨设想一个点,如果PCB里面是自己替换自己的多没意思,如果.cpp文件里的PCB可以被Java替换,shell脚本替换,岂不美哉?

第二个点,exec函数的作用是什么?

exec函数本质是一个加载函数,因为有了exec函数,在Linux中就可以将程序加载进去,因为进程程序替换的本质就是将不同的程序加载到内存里面,加载靠的就是exec*函数。


3 将代码改成多进程版本

将代码改成多线程版本,我们要做的事就是,父进程创建子进程,创建了之后,子进程执行被替换的程序,父进程只需要等待多个子进程就可以了。

此时,子进程的作用就有了两个,一个是执行父进程的代码部分,一个是让子进程执行一个全新的程序。

int main()
{printf("testexec ... begin!\n");pid_t id = fork();if (id == 0){printf("child pid: %d\n", getpid());//childexecl("/usr/bin/ls", "ls", "-l", NULL);exit(1);}int status = 0;pid_t rid = waitpid(id, &status, 0);if (rid > 0){printf("father wait success, child exit code: %d\n", WEXITSTATUS(status));}printf("testexec ... end!\n");return 0;
}

该程序创建了一个子进程,子进程实现execl,如果执行失败,也就是替换失败,就走exit,程序直接退出,退出码为1,此时父进程只需要等待即可:

以上是现象,今天的重点都不是前三个,直接进入第四个。


4 认识所有函数并使用

所有的函数一共有execl execlp execle execv execvp execvpe,不难发现,拿命令行参数进行举例的话,选项一共有l p e v。

由参数,我们可以看到有pathname 和file,我们第一个使用的pathname即路径名,我们要从哪里执行程序,得通过该路径告诉它,file同理,就是文件名,那么对于execl,代表的就是列表,也就是在命令行中我们如何执行,在该函数里面就怎么书写即可。

拿这个举例:

execl("/usr/bin/ls","ls"."-l",NULL);

因为有l,所以我们要将平常执行ls命令的时候,如何执行的给列出来,这个参数不是固定,所以我们可以执行很多,ls -l -a -n都是可以的,但是注意点是最后的参数一定要是NULL,代表结束。

第二个函数:

execv,这里面的v代表的是vector,C++中的顺序表,所以我们看execv的参数是[],也就是我们应该这样干:

int main()
{char* const argv[] ={(char*)"ls",(char*)"-l",(char*)"-a",(char*)"--color",NULL};execv("/usr/bin/ls", argv);return 0;
}

但是注意点是,最后结尾的仍然要是NULL,这里的强转char*不是很必要,看自己的版本是否会进行报错吧。

对于execvp:

p代表的是PATH,也就是环境变量,用户可以不用传对应的路径,但是要传对应的文件,就像:

int main()
{char* const argv[] ={(char*)"ls",(char*)"-l",(char*)"-a",(char*)"--color",NULL};//execv("/usr/bin/ls", argv);execvp("ls",argv);return 0;
}

那么现在关于execlp就应该不用介绍了吧?l,list出来命令行怎么写的即可,p我们传对应的文件名即可。

现在还没介绍的就只有e了,e多好理解,environment,环境变量嘛不就是,当然了,因为父进程本身就有环境变量,子进程哪里用得着担心我没有环境变量啥的,根本不担心:

使用这里就不介绍了,同理即可。

本文是非常粗略的介绍了一下进程程序替换,很多细节没有介绍到,博主会在后面全部重新翻新的!!


感谢阅读!

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

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

相关文章

汽车追尾为什么是后车的责任?

简单点说:因为人后面没有长眼睛。 结论 在汽车追尾事故中,通常情况下后车被认为是责任方的原因在于交通法规对驾驶安全标准的约定和实践中的责任识别原则。虽然追尾事故常见地被归责于后车,但具体判断并不是绝对的,仍需综合多种…

ubuntu图形界面右上角网络图标找回解决办法

问题现象: ubuntu图形界面右上角网络图标消失了,不方便联网: 正常应该是下图: 网络寻找解决方案,问题未解决,对于某些场景可能有用,引用过来: 参考方案 Ubuntu虚拟机没有网络图标或…

(C语言贪吃蛇)13.实现贪吃蛇四方向的移动

目录 前言 原代码预览 解决方法⚠️ 运行效果 总结 前言 我们上节通过Linux线程实现了两个while(1)同时运行,这样就可以一边控制方向一遍刷新出贪吃蛇的身体节点了。本节我们就来实现贪吃蛇四方向的移动。 (此图片为最终效果) 原代码预览 我们之前的代码是通过…

Unity实战案例全解析:RTS游戏的框选和阵型功能(1) 基础要素

本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered…

植物种类识别系统源码分享

植物种类识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

网络编程(12)——完善粘包处理操作(id字段)

十二、day12 之前的粘包处理是基于消息头包含的消息体长度进行对应的切包操作,但并不完整。一般来说,消息头仅包含数据域的长度,但是如果要进行逻辑处理,就需要传递一个id字段表示要处理的消息id,当然可以不在包头传i…

已解决:ImportError: cannot import name ‘get_column_letter‘

已解决:ImportError: cannot import name ‘get_column_letter’ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 检查 Openpyxl 版本2. 升级 Openpyxl3. 重新安装 Openpyxl4. 检查导入路径和函数拼写5. 检查虚拟环境6. 降级 Openpyxl 版本(…

手机使用指南:如何在没有备份的情况下从 Android 设备恢复已删除的联系人

在本指南中,您将了解如何从 Android 手机内存中恢复已删除的联系人。Android 诞生、见证并征服了 80% 的智能手机行业。有些人可能将此称为“非常大胆的宣言”,但最近的统计数据完全支持我们的说法。灵活性、高度改进的可用性和快速性是 Android 操作系统…

[20241003] 狂飙500天,国产大模型如何突破商业化之困?

大模型加速狂飙,AI商业化却面临巨大鸿沟。 一方面,传统企业不知道怎么将AI融入原始业务,另一方面,AI企业难以找到合适的变现方式。AI企业究竟该如何突破商业化之困?B端和C端,呈现出两种不同的路径。 纵…

QGIS中怎么裁剪与掩膜提取

最近,我接到了一个关于QGIS中矢量与栅格与栅格数据怎么裁剪与掩膜提取到自己想要区域的咨询。 其实这个操作,与arcgis中的操作其实是类似的 下面是我对这个问题的解决思路: 首先得把栅格与矢量数据加载进去,如下图:…

安全中心 (SOC) 与 网络运营中心 (NOC)

NOC 和 SOC 之间的区别 网络运营中心 (NOC) 负责维护公司计算机系统的技术基础设施,而安全运营中心 (SOC) 则负责保护组织免受网络威胁。 NOC 专注于防止自然灾害、停电和互联网中断等自然原因造成的网络干扰,而 SOC 则从事监控、管理和保护。 NOC 提…

Yolov11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】

一、项目背景 随着城市化进程的加速和交通网络的不断扩展,道路维护成为城市管理中的一个重要环节。道路缺陷(如裂缝、坑洞、路面破损等)不仅影响行车安全,还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…

接口隔离原则在前端的应用

什么是接口隔离 接口隔离原则(ISP)是面向对象编程中的SOLID原则之一,它专注于设计接口。强调在设计接口时,应该确保一个类不必实现它不需要的方法。换句话说,接口应该尽可能地小,只包含一个类需要的方法&am…

书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践

目录 1 环境准备 1.1 安装rust 1.2 安装Android Studio 1.3 设置环境变量 2 转换模型 2.1 安装mlc-llm 2.2 (可选)转换参数 2.3 (可选)生成配置 2.4 (可选)上传到huggingface 2.5 (可选) 测试转换的模型 3 打包运行 3.1 修改配置文件 3.2 运行打包命令 3.3 创建签…

管理方法(12)-- 采购管理

采购人员不是在为公司讨价还价,而是在为顾客讨价还价,我们应该为顾客争取最低的价钱。-----山姆 沃尔顿 沃尔玛的创始人。 1. 采购的定义和原则 5R原则:适时(Right Time)、适质(Right Quality)、适量(Right Quantity)、适价(Right Price)、适地(Right Place)。…

数据结构——栈的基本操作

前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》55 ~ 59页 🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨ 1、栈的基本概念 栈&#x…

【SpringBoot详细教程】-08-MybatisPlus详细教程以及SpringBoot整合Mybatis-plus【持续更新】

目录 🌲 MyBatis Plus 简介 🌾入门案例 🌾 MP 简介 🌲 MP 的CRUD 🌾 新增 🌾 删除 🌾 修改在进行 🌾 根据ID查询 🌾 查询所有 🌲 分页功能 🌾 设置分页参数 🌾 设置分页拦截器 🌲 优化启动 🌾 取消mbatisPlusBanner 🌾 取消Sprin…

国外电商系统开发-运维系统功能清单开发

一、最终效果图 二、功能清单 功能 描述 自定义日志绘图 根据Nginx、Apache登录日志文件绘图,绘图数据包括:访问量走势,500错误,200正确百分比等 创建服务器 加入服务器 主机状态自动检查 加入主机到系统后,系统…

LeetCode: 1971. 寻找图中是否存在路径

寻找图中是否存在路径 原题 有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点…

记OpenGL的Demo中增加ImGui后界面不显示的问题

百思不得其解: 我的ImGui界面呢? 经过不断调整代码,也可能是对这还不太熟悉吧,最终将drawData放在clearColor后界面出来了,仔细想想也能理解,先画了界面,再渲染了背景色,将界面盖住了…