Linux:进程程序替换execl

目录

引言

1.单进程版程序替换

2.程序替换原理

3.6种替换函数介绍

3.1 函数返回值

3.2 命名理解

3.3 环境变量参数


引言

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),我们所创建的所有的子进程,执行的代码,都是父进程代码的一部分!如果我们想让子进程执行新的程序呢???执行全新的代码和访问全新的数据,不在和父进程有瓜葛,这时子进程往往要调用一种exec函数以执行另一个程序

1.单进程版程序替换

execl 介绍:

第一个参数是要替换程序的路径。

第二个参数是可变参数列表:这里以NULL结束,命令行执行替换程序输入什么就传入什么。

代码示例:将子进程替换为命令行中 ls -a -l 

执行结果:

可以发现子进程id发生进程程序替换时并没有改变,并且没有执行代码中的:

2.程序替换原理

         当进程调用一种exec函数时,从外存中将新程序替换掉该进程的用户空间代码和数据,所以上面代码中第二个printf没有执行。从新程序的启动例程开始执行。且调用exec并不创建新进程,所以调用exec前后子进程的id并未改变,只是代码和数据替换。

3.6种替换函数介绍

#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 execvpe(const char *file,char *const argv[],char* const envp[]);

 

3.1 函数返回值

        如果进程程序替换成功,不会有返回值,不会执行原程序调用替换后的代码。失败有返回值,执行原程序调用替换后的代码。所以我们不需要接收返回值,可以直接让原程序退出。

3.2 命名理解

这些函数原型看起来很容易混,但只要掌握了规律就很好记。

l(list):表示参数采用可变参数列表,用来传递命令行参数

v(vector):参数采用数据传递

p(path):从环境变量PATH中寻找程序

e(env):表示自己维护环境变量

exec调用举例

#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);execv("/bin/ps", argv);// 带p的,可以使用环境变量PATH,无需写全路径execvp("ps", argv);// 带e的,需要自己组装环境变量execve("/bin/ps", argv, envp);exit(0);
}

事实上,只有execve是真正的系统调用,上面6个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。

3.3 环境变量参数

        环境变量是由父进程传递给子进程的,在程序替换时,不会替换掉进程中环境变量,所以要替换的进程环境变量与父进程环境变量是相同的,如果不是传入自己定义的环境变量,没有必要调用带e的程序替换函数。

 char* const myenv[]={"MYENY1=111111111","MYENY2=111111111","MYENY3=111111111","MYENY4=111111111",NULL};execle("./mytest","mytest","-a","-b",NULL,myenv);//传自己定义的环境变量,不是新增,而是覆盖传递

若传入的环境变量,不是在原来环境变量中新增,而是覆盖。

mytest.cc:

1 #include <iostream>2 #include <unistd.h>3 4 //程序替换,可以将命令行参数和环境变量,传递到被替换的程序的main函数中5 6 int main(int argc,char* argv[],char* env[])7 {8     for(int i =0;i<argc;i++)9     {10         std::cout << i << " -- " << argv[i] << std::endl;                                                                                                11     }12 13     //打印环境变量 指针数组 环境变量在系统中是全局存在的 父进程是bash的子进程, 子进程环境变量是父进程给的14     for(int i = 0;environ[i]!=NULL;i++)15     {16         std::cout<<i<<" : "<<env[i]<<std::endl;17     }18 19     return 0;20 }

结果:

gitee链接

本篇结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode.02.04.分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …

Johnson算法 流水线问题 java实现

某印刷厂有 6项加工任务J1&#xff0c;J2&#xff0c;J3&#xff0c;J4&#xff0c;J5&#xff0c;J6&#xff0c;需要在两台机器Mi和M2上完 成。 在机器Mi上各任务所需时间为5,1,8,5,3,4单位; 在机器M2上各任务所需时间为7,2,2,4,7,4单位。 即时间矩阵为&#xff1a; T1 {5, …

按键++,--在操作uint8_t类型(一个取值为1~10的数)中,在LCD中显示两位数字问题

问题概况 在执行按键&#xff0c;--过程中&#xff0c;本来数值为1~10.但是在执行过程中&#xff0c;发现数值在经过10数值后&#xff0c;后面的“0”会一直在LCD显示屏中显示。 就是执行操作中&#xff0c;从1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xf…

【QT】QTreeWidgetItem的checkState/setCheckState函数和isSelected/setSelected函数

目录 1、函数原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函数和isSelected/setSelected这两组函数有着不同的用途,下面具体说明: 1、函数原型 1.1 checkState/setCheckState Qt::CheckState QTr…

005 vue项目结构 vue请求页面执行流程(vue2)

文章目录 vue项目结构vue请求页面执行流程main.jsrouterHelloWorld.vueApp.vueindex.html vue项目结构 config目录存放的是配置文件&#xff0c;比如index.js可以配置端口 node_modules存放的是该项目依赖的模块&#xff0c;这些依赖的模块在package.json中指定 src目录分析 1…

汇丰xxx

1. Spring Boot 的了解&#xff0c;解决什么问题&#xff1f; 我的理解&#xff1a; Spring Boot 是一个基于 Spring 框架的快速开发脚手架&#xff0c;它简化了 Spring 应用的初始搭建和开发过程。解决的问题&#xff1a; 简化配置&#xff1a; 传统的 Spring 应用需要大量的…

基于 Spring Boot 瑞吉外卖系统开发(一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;一&#xff09; 系统概述 系统功能 技术选型 初始项目和数据准备 初始项目和SQL文件下载 创建数据库并导入数据 打开reggie项目 运行效果 主函数启动项目&#xff0c;访问URL&#xff1a; http://127.0.0.1:8080/backend/pag…

大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具

大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比&#xff0c;选择合适自己的LLM工具 Coze、Dify、FastGPT 和 MaxKB 都是旨在帮助用户构建基于大型语言模型 (LLM) 的智能应用的平台。它们各自拥有独特的功能和侧重点&#xff0c;以下是对它们的简要对比&#xff1a; Coz…

【项目管理】第6章 信息管理概论 --知识点整理

项目管理 相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…

Zapier MCP:重塑跨应用自动化协作的技术实践

引言&#xff1a;数字化协作的痛点与突破 在当今多工具协同的工作环境中&#xff0c;开发者与办公人员常常面临数据孤岛、重复操作等效率瓶颈。Zapier推出的MCP&#xff08;Model Context Protocol&#xff09;协议通过标准化数据交互框架&#xff0c;为跨应用自动化提供了新的…

echart实现动态折线图(vue3+ts)

最近接到个任务&#xff0c;需要用vue3实现动态折线图。之前没有用过&#xff0c;所以一路坎坷&#xff0c;现在记录一下&#xff0c;以后也好回忆一下。 之前不清楚echart的绘制方式&#xff0c;以为是在第一秒的基础上绘制第二秒&#xff0c;后面实验过后&#xff0c;发现并…

Java学习——day24(反射进阶:注解与动态代理)

文章目录 1. 反射与注解2. 动态代理3. 实践&#xff1a;编写动态代理示例4. 注解定义与使用5. 动态代理6. 小结与思考 1. 反射与注解 注解&#xff1a;注解是 Java 提供的用于在代码中添加元数据的机制。它不会影响程序的执行&#xff0c;但可以在运行时通过反射获取和处理。反…

C++之nullptr

文章目录 前言 一、NULL 1、代码 2、结果 二、nullptr 1、代码 2、结果 总结 前言 当我们谈论空指针时,很难避免谈及nullptr。nullptr是C++11引入的一个关键字,用来表示空指针。在C++中,空指针一直是一个容易引起混淆的问题,因为在早期版本的C++中,通常使用NULL来…

JavaScript惰性加载优化实例

这是之前的一位朋友的酒桌之谈&#xff0c;他之前负责的一个电商项目&#xff0c;刚刚开发万&#xff0c;首页加载时间特别长&#xff0c;体验很差&#xff0c;所以就开始排查&#xff0c;发现是在首页一次性加载所有js导致的问题&#xff0c;这个问题在自己学习的时候并不明显…

苹果内购支付 Java 接口

支付流程&#xff0c;APP支付成功后 前端调用后端接口&#xff0c;后端接口将前端支付成功后拿到的凭据传给苹果服务器检查&#xff0c;如果接口返回成功了&#xff0c;就视为支付。 代码&#xff0c;productId就是苹果开发者后台提前设置好的 产品id public CommonResult<S…

数据库中的数组: MySQL与StarRocks的数组操作解析

在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…

LeetCode零钱兑换(动态规划)

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

/sys/fs/cgroup/memory/memory.stat 关键指标说明

目录 1. **total_rss**2. **total_inactive_file**3. **total_active_file**4. **shmem**5. **其他相关指标**总结 以下是/sys/fs/cgroup/memory/memory.stat文件中一些关键指标的详细介绍&#xff0c;特别是与PostgreSQL相关的指标&#xff1a; 1. total_rss 定义&#xff1…

C++第14届蓝桥杯b组学习笔记

1. 日期统计 小蓝现在有一个长度为 100100 的数组&#xff0c;数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…

[Effective C++]条款28:避免返回handles指向对象内部成分

. 在C中&#xff0c;返回指向对象内部成分的引用&#xff08;handles&#xff09;可能会导致封装性降低和对象空悬问题。为了避免這些问题&#xff0c;可以通过返回const引用来限制对内部数据的修改&#xff0c;从而确保只读访问 1、返回内部引用对象 下面代码中getData函数返…