C++ —— 进程控制 - 进程程序替换

目录

4.进程程序替换

[4.1 替换原理](#4.1 替换原理)

[4.2 替换函数](#4.2 替换函数)

[4.3 使用其它接口](#4.3 使用其它接口)

[4.3.1 execl()](#4.3.1 execl())

[4.3.2 execv()](#4.3.2 execv())

[4.3.3 execlp()](#4.3.3 execlp())

[4.3.4 execvp()](#4.3.4 execvp())

[4.3.5 总结:](#4.3.5 总结:)

[4.3.6 execvpe()](#4.3.6 execvpe())

​编辑

[4.3.7 execle()](#4.3.7 execle())


4.进程程序替换

fork() 之后,父子各自执行父进程代码的一部分,如果子进程想执行一个全新的程序呢?进程的程序替换来完成这个功能!

程序替换是通过特定的接口,加载磁盘上的一个全新的程序(代码和数据),加载到调用进程的地址空间中!

4.1 替换原理

⽤fork创建⼦进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调⽤⼀种 exec 函数以执行另⼀个程序。当进程调用⼀种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。调用exec 并不创建新进程,所以调用exec 前后该进程的 id 并未改变。

证明:调用 exec 并不创建新进程,所以调用exec 前后该进程的 id 并未改变。

运行结果:

4.2 替换函数

cpp 复制代码
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
  • 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
  • 如果调用出错则返回 -1
  • 所以 exec 函数只有出错的返回值而没有成功的返回值。
  • l(list) : 表示参数采用列表
  • v(vector) : 参数用数组
  • p(path) : 有 p 自动搜索环境变量 PATH
  • e(env) : 表示自己维护环境变量

运行结果:

4.3 使用其它接口

4.3.1 execl()

运行结果:

所以父进程等待子进程的原因是,子进程的执行的情况如何,不清楚,通过退出码,退出码为0表示当前的命令执行成功了,而0就是给父进程看的。

4.3.2 execv()

运行结果:

运行结果:

分析:

4.3.3 execlp()

运行结果:

4.3.4 execvp()

运行结果:

4.3.5 总结:

4.3.6 execvpe()

运行结果:

运行结果:

mycmd.cc 的命令行参数和环境变量是怎么来的呢?

既想把自定义环境变量,又想把系统默认的也传递过去,就用putenv()

运行结果:

环境变量在程序替换的时候,出场率并不高,所以就不必担心环境变量的问题,最终是要认识到创建的子进程进行程序替换时,可以导入系统的环境变量也可以导入自定义的环境变量,也可以把自定义和系统的都导入就可以了。

4.3.7 execle()

可以结合前面的接口,来自行了解execle()应该如何使用。

以下6个接口是在三号手册,库函数中。

还有一个接口:**execve()**是在二号手册中,系统调用

上面的6个接口全部调用的是 execve() 这个系统调用**。**

相关推荐
辞旧 lekkk4 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
腾讯蓝鲸智云4 小时前
【运维自动化-节点管理】节点管理的插件策略如何使用
运维·自动化·云计算·sass·paas
疯狂成瘾者6 小时前
服务器的单体和集群
运维·服务器
liuhuizuikeai6 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
初願致夕霞7 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
charlie1145141919 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
飞Link10 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
消失的旧时光-194310 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..10 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
kdxiaojie10 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习