【Linux】详解进程程序替换

news/2024/4/29 1:48:47/文章来源:https://blog.csdn.net/m0_74265792/article/details/137058629

一、替换原理

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。程序替换所做的本质工作就是将代码和数据加载到内存。

        替换系统命令时命令行怎么写,参数就怎么传,参数以NULL结尾程序替换一旦成功,exec*后序的代码不再执行。因为原程序的数据和代码被替换掉了。exec*程序替换接口只有失败返回值,没有成功返回值。

二、子进程进行程序替换

        通过子进程进行程序替换可以让子进程帮我们去做一部分工作,而且子进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){execl("/usr/bin/ls", "ls", "-l", NULL);exit(0);}pid_t rid = waitpid(id, NULL, 0);printf("wait success!\n");return 0;
}

2.1、让子进程执行我自己的程序

        我自己写了一个C++程序,向替换子进程帮我跑一下:

//C++程序
#include <iostream>
using namespace std;int main()
{cout << "Hello Linux!" << endl;cout << "Hello Linux!" << endl;cout << "Hello Linux!" << endl;cout << "Hello Linux!" << endl;return 0;
}

 C程序:

//让子进程执行我自己写的程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){execl("./mytest", "./mytest", NULL);exit(0);}pid_t rid= waitpid(id, NULL, 0);if(rid > 0)printf("wait success!\n");return 0;
}

        执行结果如下,证明了我们不仅仅可以替换子进程执行系统程序,还可以替换子进程执行我们的程序。 无论是什么语言,只要能在Linux系统下跑,都可以用exec系列的接口进行程序替换,exec系列的接口只认二进制代码和数据。

三、各种exec接口

 其它六个接口在底层都封装了execve系统调用接口。

3.1、execlp 

        exec接口中,l意为list,表示参数列表,v意为vector,就指的是数组名字中带p的这个p指的是PATH,也就是说你不用告诉系统,程序在哪里,只要告诉我名字就行,系统会自动到你这个进程的PATH环境变量中所保存的路径中寻找。execlp只有第一个参数和execl不同,其余参数都相同。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){execlp("ls", "ls", "-l", NULL);exit(0);}pid_t rid = waitpid(id, NULL, 0);printf("wait success!\n");return 0;
}

3.2、execv/execvp

        execv的用法与execl的用法大致相同,只不过将execl后面的可变参数列表换成一个指针数组。execvp也只是将execv前面的路径换成程序名而已。不过这里要强调的是:不要忘了路径最前面的那一个斜杠,还有数组的结束标志是NULL,一定要在数组的最后加上NULL

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){char* argv[] = {"ls", "-l", "-a", NULL};//execvp("ls", argv);execv("/usr/bin/ls", argv);exit(0);}pid_t rid= waitpid(id, NULL, 0);if(rid > 0)printf("wait success!\n");return 0;
}

3.3、execle/execvpe/execve

        程序替换不会替换环境变量数据可以通过地址空间继承的方法,让子进程拿到父进程的所有环境变量。如果我们想传递全新的环境变量表给子进程,就要使用带e的程序替换接口。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();if(id == 0){char* env[] ={"aaa=bbbbbbbbbbbbbbbb", NULL};execle("./mytest", "./mytest",NULL,  env);exit(0);}pid_t rid= waitpid(id, NULL, 0);if(rid > 0)printf("wait success!\n");return 0;
}

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

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

相关文章

It takes two (搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 AAAO AAAA AAAA 输出 NO 思路&#xff1a; 根据题目意思&#xff0c;如果存在的 A 联通不可以成为 矩形&#xff0c;输出 NO&#xff0c;否则输出 YES 这道题看数据范…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

Linux文件系统和日志管理

文件系统的组成 Linux 文件系统会为每个文件分配两个数据结构&#xff1a;索引节点&#xff08;index node&#xff09; 和 目录项&#xff08;directory entry&#xff09;&#xff0c;它们主要用来记录文件的元信息和目录层次结构。 索引节点&#xff0c;也就是 inode&#…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

7.shell for循环

shell 循环 for循环案例1:案例2&#xff1a;案例3:案例4:案例5:案例6&#xff1a;案例7:案例8&#xff1a;案例9:案例10:案例11: for循环 什么是循环 重复执行一段代码 比如批量创建100个用户&#xff0c;可以用到循环。 循环的目的是为了简化代码&#xff0c;提高代码的重复利…

Unity学习笔记 9.2D射线

下载源码 UnityPackage 1.Ray2D 让小球向右发射射线&#xff1a; Ray2D ray;void Start() {// Ray2D(起点&#xff0c;终点)ray new Ray2D(this.transform.position, Vector2.right);// Debug.DrawLine(起点&#xff0c;终点&#xff0c;颜色&#xff0c;显示时间)Debug.DrawL…

Matlab高光谱遥感分析:提升植被监测的精度

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

【Web前端】CSS基本语法规范和引入方式常见选择器用法常见元素属性

一、基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁) 声明决定修改什么.。(干什么) 声明的属性是键值对.。使用 &#xff1a; 区分键值对&#xff0c; 使用 &#xff1a; 区分键和值。 <!DOCTYPE html> <html lang"en"> <head>&…

【鸿蒙HarmonyOS开发笔记】使用@Preview装饰器预览组件

概述 ArkTS应用/服务支持组件预览&#xff0c;要求compileSdkVersion为8或以上。组件预览支持实时预览&#xff0c;不支持动态图和动态预览。组件预览通过在组件前添加注解Preview实现&#xff0c;在单个源文件中&#xff0c;最多可以使用10个Preview装饰自定义组件。 Preview…

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览…

构建vue3项目以及bem架构

构建vue3vite项目 &#xff08;1&#xff09;使用vite初始化一个项目 npm init vitelatest &#xff08;2&#xff09;构建cli项目 vue create <project> bem架构 src下新建文件bem.scss $namespace: "xc" !default; $block-sel: "-" !defaul…

Spark-Scala语言实战(5)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#xff08;…

国内外主要气象卫星介绍

NOAA AVHRR介绍 美国NOAA极轨卫星从1970年12月第一颗发射以来&#xff0c;近40年连续发射了18颗&#xff0c;最新的NOAA-19也将在2009年发射升空。NOAA卫星共经历了5代&#xff0c;目前使用较多的为第五代NOAA卫星&#xff0c;包括NOAA-15—NOAA-18&#xff1b;作为备用的第四…

MySQL语句(补充)

目录 一、子查询 1.1.select 语句 1.1.1.相同表查询 1.1.2.多表查询 1.1.3.NOT 1.1.4. insert 1.1.5. update 1.1.6.delete 1.1.7.exists 1.1.8.as别名 二、MySql视图 2.1.视图与表的区别和联系 2.2.建立视图 2.3.修改视图表数据 三、NULL值 四、连接查询 4…

常见的数学方法

Math类表示数学类&#xff0c;其中的数学方法都被定义成为static形式&#xff0c;所以可以直接通过Math类的类名调用某个数学方法。语法格式&#xff1a; Math.xxx(参数)&#xff1b; 例题 输入n个整数a1,a2,a3,......an,求这n个数的最大值max&#xff0c;最小值min&#xff0…

MongoDB高可用架构涉及常用功能整理

MongoDB高可用架构涉及常用功能整理 1. mongo架构和相关组件1.1. Master-Slave主从模式1.2. Replica Set 副本集模式1.3. Sharding 分片模式 2. Sharding 分片模式2.1. Hashed Sharding方式2.2. Range Sharding方式 3. 事务性4. 疑问和思考4.1. 怎么保证数据的高可靠&#xff1…

网约车APP小程序源码代驾顺风拼车货运司乘端安卓苹果源码可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

入门指南|营销中人工智能生成内容的主要类型 [新数据、示例和技巧]

由于人工智能技术的进步&#xff0c;内容生成不再是一项令人头疼的任务。随着人工智能越来越多地接管手动内容制作任务&#xff0c;营销人员明智的做法是了解现有的不同类型的人工智能生成内容&#xff0c;以及哪些内容从中受益最多。这些工具可以帮助我们制作对您的受众和品牌…