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); }剩下来大同小异,这里不做过多介绍.

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/25 12:45:43
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/24 14:25:52
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/24 14:49:33
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/23 8:01:38
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 14:28:18
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/25 15:49:36

日新闻

周新闻