进程的替换

1.概念

它是指一个正在运行的进程,用新程序的代码段、数据段、堆栈段等替换自身原有内容,但进程 ID(PID)、打开的文件描述符、进程优先级等核心属性保持不变的操作。

简单来说,进程替换不是 "创建新进程",而是 "给现有进程换一套'执行内容'"------ 就像同一个人(PID 不变)换了一套完全不同的工作任务(程序代码),但身份信息、持有的工具(打开的文件)不变。

进程被替换后其虚拟地址和物理地址都会变化

2.进程替换的性质

1.子进程被替换不会影响父进程

子进程被替换的时候本质上不回触发写实拷贝

其内存操作是 "丢弃原有内存页,加载新程序的内存页"

子进程会直接更换虚拟地址和物理地址

替换后子进程不再和父进程共享代码

而是使用新的代码 新的虚拟地址和物理地址

所以不会影响父进程

2.父进程被替换不会影响子进程

父进程被替换的时候其页表的虚拟地址和物理地址都会被新的替换

但是原先的虚拟地址和物理地址 子进程会接着用

3.进程被替换不会执行后面的代码

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
int main() {
    printf("before: I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
    execl("/root", "ls","l", (char*)NULL);
    printf("after: this line will not be executed\n");
    return 0;
}

我们发现当excel执行后(也就是进程被替换后)后续的代码不回被执行

也就是after: this line will not be executed 这句话不会被打印

3.进程替换函数

进程替换函数有6个

这六个函数的返回值是一样的

成功时:均无返回(因为当前进程已被新程序替换,原进程的后续代码不再执行);

失败时:均返回-1,并设置errno以提示具体错误原因(如程序不存在、权限不足等)。

前面演示过代码 这里就不作过多介绍了

1.execl

cpp 复制代码
int execl(const char *path, const char *arg, ..., (char *)NULL);

参数:

path:目标程序的完整路径(如/bin/ls);

arg, ...:变长参数列表,第一个arg通常是程序名(与path指向的程序名一致),后续是程序的命令行参数,

末尾必须以(char *)NULL结束;

2.execv

cpp 复制代码
int execv(const char *path, char *const argv[]);

参数:

path:目标程序的完整路径;

argv[]:字符串数组,存储程序的命令行参数,数组末尾必须为NULL(第一个元素通常是程序名);

3.execlp

cpp 复制代码
int execlp(const char *file, const char *arg, ..., (char *)NULL);

参数:

file:目标程序的文件名(无需完整路径,系统会自动从PATH环境变量指定的路径中搜索,如ls);

arg, ...:变长参数列表,规则同execl(第一个arg为程序名,末尾以(char *)NULL结束);

4.execvp

cpp 复制代码
int execvp(const char *file, char *const argv[]);

参数:

file:目标程序的文件名(自动从PATH搜索);

argv[]:字符串数组,存储命令行参数,数组末尾必须为NULL;

5.execle

cpp 复制代码
int execle(const char *path, const char *arg, ..., (char *)NULL, char *const envp[]);

参数:

path:目标程序的完整路径;

arg, ...:变长参数列表,规则同execl(末尾以(char *)NULL结束);

envp[]:自定义环境变量数组,数组末尾必须为NULL(每个元素格式为"环境变量名=值");

6.execve

cpp 复制代码
int execve(const char *path, char *const argv[], char *const envp[]);

参数:

path:目标程序的完整路径;

argv[]:命令行参数数组,末尾必须为NULL;

envp[]:自定义环境变量数组,末尾必须为NULL;

4.如何传环境变量给子进程

1.在父进程中添加环境变量 使用putenv函数

然后子进程会继承父进程的环境变量

相关推荐
U***746933 分钟前
Linux(CentOS)安装 MySQL
linux·mysql·centos
3***g20533 分钟前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
love530love1 小时前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar
Dovis(誓平步青云)1 小时前
《内核视角下的 Linux 锁与普通生产消费模型:同步原语设计与性能优化思路》
linux·运维·性能优化
xu_yule1 小时前
Linux_13(多线程)页表详解+轻量级进程+pthread_create
linux·运维·服务器
草莓熊Lotso2 小时前
《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题
开发语言·c++·经验分享·笔记·其他·算法·动态规划
江湖有缘3 小时前
Linux系统之htop命令基本使用
linux·运维·服务器
CodeByV3 小时前
【Linux】基础 IO 深度解析:文件、描述符与缓冲区
linux
xu_yule9 小时前
Linux_12(进程信号)内核态和用户态+处理信号+不可重入函数+volatile
linux·运维·服务器
FFF团团员9099 小时前
树莓派学习笔记3:LED和Button
笔记·学习