尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
linux之进程管理(二)--替换
我们先来看一个现象程序运行到execl这里的时候,去执行ls的命令行操作,但是并没有执行后面的代码,这是怎么回事呢???这是我们正常的的一个进程当我们运行execl这个函数的时候,将磁盘里面的数据加载到这个里面物理内存里面,将原来的代码和数据部分覆盖自然就看不到printf所打印出来的内容在实践中,我们通常会让子进程来完成程序替换的过程当父子进程都不对数据和代码修改时当任意一方对数据发生修改时调用程序替换函数时,将磁盘的文件加载到内存,覆盖子进程的代码和数据至此彻底完成父子进程的分离程序替换函数// 1. execl​ 2int execl(const char *path, const char *arg0, ..., (char *)NULL);​ 3// 2. execlp​ 4int execlp(const char *file, const char *arg0, ..., (char *)NULL);​ 5// 3. execle​ 6int execle(const char *path, const char *arg0, ..., (char *)NULL, char *envp[]);​ 7​ 8// 4. execv​ 9int execv(const char *path, char *const argv[]);​ 10// 5. execvp​ 11int execvp(const char *file, char *const argv[]);​ 12// 6. execvpe​ 13int execvpe(const char *file, char *const argv[], char *const envp[]);​ 14​ 15// 7. execve真正系统调用内核接口​ 16int execve(const char *path, char *const argv[], char *const envp[]);字母含义llist参数逐个罗列最后必须 NULLvvector参数放进字符串数组传参ppath自动搜索环境变量 PATH不用写完整绝对路径eenv手动传入自定义环境变量数组通用特性全部 7 个函数一致成功永不返回原程序代码全部被覆盖后面代码不执行失败返回-1可 perror 打印错误不创建新进程PID 不变仅替换当前进程运行程序已打开的文件描述符默认继承除非设置 FD_CLOEXEC。详细说明execl// 1. execl int execl(const char *path, const char *arg0, ..., (char *)NULL);#includestdio.h 2 #includeunistd.h 3 #includesys/wait.h 4 #includestdlib.h 5 int main() 6 { 7 printf(我是父进程,pid:%d\n,getpid()); 8 printf(\n); 9 pid_t idfork(); 10 if(id0){ 11 printf(下面是子进程执行的代码\n); 12 execl(/bin/ls,ls,-l,NULL); 13 } 14 int status0; 15 pid_t ridwaitpid(-1,status,0); 16 if(rid0) 17 { 18 printf(\n); 19 printf(成功回收子进程\n); 20 } 21 return 0; 22 }execlp// 2. execlp int execlp(const char *file, const char *arg0, ..., (char *)NULL);if(id0) { printf(下面是子进程执行的代码\n); execlp(ls,ls,NULL); }execv// 4. execv int execv(const char *path, char *const argv[]);if(id0) { printf(下面是子进程执行的代码\n); char *const argv[] { ls,-a,-l,--colorauto ,NULL}; execv(/bin/ls,argv); }execvp// 5. execvp int execvp(const char *file, char *const argv[]);if(id0) { printf(下面是子进程执行的代码\n); char *const argv[] { ls,--colorauto ,NULL}; execvp(ls,argv); }在上面的案例中都是用系统的,那能不能用我们直接写的可执行文件呢???显然是可以的if(id0){ printf(下面是子进程执行的代码\n); execl(./test/Replace.exe,Replace,NULL); }execvpe// 6. execvpe int execvpe(const char *file, char *const argv[], char *const envp[]);e就是要我们手动传入环境变量和之前没有e的又有什么区别吗??一个通俗比喻父进程手里有一整本资料所有环境变量PATH、HOME、USER……execvp无 e直接复印整本资料交给新程序execvpe有 e旧资料作废你亲手写一张新纸条交给新程序。 纸条上必须写上 PATH否则新程序找不到 ls。if(id0) { printf(下面是子进程执行的代码\n); char *const argv[] { testEnviron.exe,-a,-c,6 ,NULL}; char *envp[] {PATH/home/pineapple/pineapple_dir/linux-learning/processReplace/test,NULL }; extern char **environ; execvpe(./test/testEnviron.exe,argv,environ); //execvpe(./test/testEnviron.exe,argv,envp); perror(execvpe 调用失败原因); _exit(1); }使用我们自己传入的环境变量if(id0) { printf(下面是子进程执行的代码\n); char *const argv[] { testEnviron.exe,-a,-c,6 ,NULL}; char *envp[] {PATH/home/pineapple/pineapple_dir/linux-learning/processReplace/test,NULL }; execvpe(./test/testEnviron.exe,argv,envp); perror(execvpe 调用失败原因); _exit(1); }在原来老的环境变量上面加上新的环境变量if(id0) { printf(下面是子进程执行的代码\n); char *const argv[] { testEnviron.exe,-a,-c,6 ,NULL}; char *envp[] {PATH/home/pineapple/pineapple_dir/linux-learning/processReplace/test,NULL }; extern char **environ; putenv(PATH/home/pineapple/pineapple_dir/linux-learning/processReplace/test); execvpe(./test/testEnviron.exe,argv,environ); // execvpe(./test/testEnviron.exe,argv,envp); perror(execvpe 调用失败原因); _exit(1); }剩下来大同小异,这里不做过多介绍.
RELATED

相关推荐

MySQL中文乱码全解析:从原理到解决方案

MySQL中文乱码全解析:从原理到解决方案

1. 乱码问题的本质与常见场景当MySQL、phpMyAdmin和PHP三者之间出现中文乱码时,本质上都是字符编码不一致导致的。这种情况在Web开发中极为常见,尤其是新手在搭建LAMP环境时几乎都会遇到。我处理过上百个类似案例,发现乱码通常发生在以下几个…

📅 2026/8/23 9:19:24
工地基坑积水检测数据集VOC+YOLO格式300张1类别

工地基坑积水检测数据集VOC+YOLO格式300张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):300标注数量(xml文件个数):300标注数量(txt文件个数):300标注类别数&…

📅 2026/8/23 9:19:24
AI多Agent协作系统实战(二十一):路径遍历、Token鉴权、原子写入、哈希校验——AI Agent系统中的安全防护到底有多重要?

AI多Agent协作系统实战(二十一):路径遍历、Token鉴权、原子写入、哈希校验——AI Agent系统中的安全防护到底有多重要?

系列第21篇 | 那些听起来"很安全"的东西,在Agent系统里到底是必需品还是花架子开场 “路径遍历、Token鉴权、原子写入、哈希校验——这些听起来很安全的东西,在AI Agent系统里到底有多重要?” 这是今天下午我们讨论的一个问题。起因…

📅 2026/9/10 6:32:27
MORE NEWS

更多资讯

📰

图解dnf妖精的尾巴原理:解决环境配置卡半天难题

图解dnf妖精的尾巴原理:解决环境配置卡半天难题 配置环境就卡半天?这是很多刚接触微服务架构的劳务班组负责人最真实的痛点。别急,今天咱们不整虚的,直接上干货。通过图解原理的方式,拆解dnf妖精的尾巴在微服务中的核心逻辑,让你从“配置地狱”中…

📰

3天搞定超越时间线保姆级教程告别教程依赖症

3天搞定超越时间线保姆级教程告别教程依赖症 看了一堆教程还是不会写项目,这种痛苦只有真正动手写过代码的人才懂。很多初学者陷入“视频看了一遍,代码抄了一遍,关掉电脑脑子空空”的死循环。今天这篇超越时间线保姆级教程,不讲空洞理论,直接带你从零搭…

📰

SIFT、PCA-SIFT与GLOH特征匹配算法对比与实践

1. 项目背景与核心目标在计算机视觉领域,图像特征匹配是许多高级任务的基础环节。无论是三维重建、目标识别还是图像拼接,都需要在不同图像之间建立准确的特征对应关系。这个项目聚焦于三种经典的特征描述算法——SIFT、PCA-SIFT和GLOH,通过对…

📰

SpringBoot+Vue订单转手系统设计与实现

1. 项目概述与背景在当今电商蓬勃发展的时代背景下,商品交易系统的效率和灵活性成为核心竞争力。传统电商平台往往只支持买卖双方直接交易,当买家需要转让已购商品时,只能通过线下协商或第三方平台完成,存在流程繁琐、信息不透明等…

📰

麦克风混响软件底层逻辑:5个高频面试题拆解

麦克风混响软件底层逻辑:5个高频面试题拆解 刚入职被坑过吗?把网上抄的音频处理代码往项目里一扔,编译倒是过了,但一跑起来,混响效果要么像在山洞里喊话,要么直接爆音。这时候你盯着报错信息发懵,根本不知道是参数没调对,还是算法逻辑本身就有坑。这…

📰

3步搞定列表网数据速查手册 拒绝复制代码报错

3步搞定列表网数据速查手册 拒绝复制代码报错 刚接手一个跨省转介的市政管网项目,从网上扒了个现成的数据清洗脚本,想着能省点事。结果一跑,直接红屏报错,看着满屏的 Traceback…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬