进程替换【Linux】

目录

[1 进程替换现象](#1 进程替换现象)

[2 进程替换原理](#2 进程替换原理)

[3 多进程](#3 多进程)

[4 其他进程替换方法](#4 其他进程替换方法)

1 进程替换现象

运行结果:

发现进程去执行ls命令

2 进程替换原理

使用fork创建子进程后执行的是和父进程相同的程序(但也有可能执行不同的代码分支),子进程往往要调用一种exec函数来执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据 完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

把代码和数据 替换 原进程的代码和数据

从被替换进程的角度:本质就是这个程序被加载到内存了;

如何加载:exec* 类似于一种Linux上的加载函数,涉及到系统调用。

进程替换成功场景:

进程替换后面的代码不再继续执行

exec*系列的函数执行完毕后,后续代码的不见了,是因为被替换了。

进程替换成功,就不会向后继续运行了,如果继续运行,说明一定是替换失败了!

进程替换失败场景:

下图展示替换失败的情况:

运行结果:

3 多进程

fork创建子进程,让子进程自己去替换,父进程wait

运行结果:

创建子进程,目的是让子进程去完成任务:

  1. 让子进程执行父进程代码的一部分;

  2. 让子进程执行一个全新的进程。

进程具有独立性,进程发生替换时(也就是让子进程执行一个全新的程序),会发生写时拷贝。

4 其他进程替换方法

使用所有的替换方法,并且认识函数参数的含义

execl中的l 表示list ,参数采用列表形式

execv中的v 表示vector,参数采用数组形式

execvp中的p 表示有p自动搜索环境变量PATH

execle中的e 表示自己维护环境变量

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
        char* const argv[] = {"ps","-ef",NULL};
        char* const envp[] = {"PATH=/bin:/usr/bin","TERM=console",NULL};

        execl("/bin/ps","ps","-ef",NULL);

        //带p的,可以使用环境变量PATH,无需写全路径
        execlp("ps","ps","-ef",NULL);

        //带e的,需要自己组装环境变量
        execle("ps","ps","-ef",NULL,envp);

        //带v的参数用数组
        execv("/bin/ps",argv);

        execvp("ps",argv);

        exit(0);

        return 0;
}

path:表示要执行的程序需要带路径,也就是告诉函数怎么找到程序。先找到,在执行。

其余参数:就是在命令行中怎么执行,就这么传参

相关推荐
古法老登瞎折腾5 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.6 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu6 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈8 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
云边云科技_云网融合9 小时前
连锁门店组网怎么做?SD-WAN 多分支组网的架构选型、部署与成本结构
服务器·数据库·php
云上先途19 小时前
企业 AI 服务部署周期多久,会不会影响原有业务运转?
大数据·运维·人工智能
网络小江9 小时前
组网第35课:静态路由——下一跳、出接口、默认路由、浮动静态与黑洞路由
服务器·网络·默认路由·黑洞路由·浮动静态路由
执伞人ONLY10 小时前
AI知识库自动化知识加工没做对,人工整理永远追不上知识产生
运维·人工智能·自动化
slongzhang_10 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮10 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节