Linux笔记---进程:进程替换
1. 进程替换的概念
进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。
这种技术通常用于在不创建新进程的情况下,改变进程的行为。
我们之前谈到过fork函数,这个函数可以启动一个子进程,子进程继承了父进程的代码和数据。
在谈到进程替换之前,我们只能通过判断fork函数的返回值id来区分父子进程,并让二者运行不同的分支。而利用进程替换技术,我们可以将子进程的代码数据完全替换为另一个程序,实现我们所期望的,父子进程完全独立为两个不同的进程。
进程替换的原理
进程替换的原理涉及到操作系统的内存管理和进程控制。当一个进程调用exec系列函数时,操作系统会将新程序的代码和数据加载到内存中,并将其与当前进程的地址空间相关联。这个过程通常涉及到以下几个步骤:
- 加载新程序:操作系统将新程序的可执行文件从磁盘加载到内存中。
- 替换代码和数据:新程序的代码和数据会替换当前进程的代码和数据段。
- 更新进程状态:进程的状态会被更新,以反映新程序的执行状态。
- 执行新程序:进程开始执行新程序的入口点,通常是main函数。
在这个过程中,进程的标识符(PID)和其他一些属性(如打开的文件描述符、环境变量等)通常会保持不变。
2. exec进程替换函数
在Linux系统中,进程替换通常通过exec系列函数来实现,该系列函数包含在头文件<unistd.h>。
这些函数包括:
execl:执行一个新程序,参数以列表形式给出。int execl(const char *pathname, const char *arg, ...);execlp:执行一个新程序,参数以列表形式给出,并在环境变量PATH中搜索程序。int execlp(const char *file, const char *arg, ...);execle:执行一个新程序,参数以列表形式给出,并提供自定义的环境变量。int execle(const char *pathname, const char *arg, ...);execv:执行一个新程序,参数以数组形式给出。int execv(const char *pathname, char *const argv[]);execvp:执行一个新程序,参数以数组形式给出,并在环境变量PATH中搜索程序。int execvp(const char *file, char *const argv[]);execve:执行一个新程序,参数以数组形式给出,并提供自定义的环境变量。int execve(const char *pathname, char *const argv[], char *const envp[]);execvpe:执行一个新程序,参数以数组形式给出,并提供自定义的环境变量。int execvpe(const char *file, char *const argv[], char *const envp[]);
这些函数的使用方式和参数传递方式略有不同,但它们的基本功能都是相同的:用新程序替换当前进程的代码和数据。
记忆技巧:
- l(list):表示参数采用列表。
- v(vector):参数用数组。
- p(path):到环境变量PATH中搜索指定程序,无需完整路径(带p的函数第一个参数为file,代表可执行程序;不带p的函数第一个参数为pathname,代表完整路径)。
- e(env) : 表示自定义环境变量,不带e的表示继承当前的环境变量。
使用示例:
#include <stdio.h>
#include <unistd.h>int main()
{char* vector[] = {"ls", "-l", "-a", NULL};int id = fork();if(id == 0){execvp("ls", vector);return 0;}int pid = wait(NULL);return 0;
}
注意:传入的参数为命令行参数,也就是说在命令行要执行该程序需要输入什么,参数就传递什么,主要是不要忘记选项是从第二个参数开始的。
第一个参数传什么都不要紧,随你喜欢,但要记得传:
#include <stdio.h>
#include <unistd.h>int main()
{char* vector[] = {"cxk", "-l", "-a", NULL};int id = fork();if(id == 0){execvp("ls", vector);return 0;}int pid = wait(NULL);return 0;
}
execve函数
该函数相比于其他函数具有一定的特殊性,他是上述函数中唯一一个系统调用。
在命令行输入[man exec]能查到如下信息,可以看到并没有execve的存在,且这些函数都在3号手册当中:

只有单独查询execve函数时才能查到,可以看到该函数在2号手册(系统调用接口)中:

execve函数的特殊性:
- 系统调用层级的基础地位
execve在exec函数族中具有特殊的基础性地位。它是直接与系统调用接口紧密相连的函数。其他的exec系列函数(如execl、execv等)在很多情况下最终可能会调用execve来实现实际的进程替换操作。- 例如,在一些库函数的实现中,为了提供更方便的参数传递方式(如
execl的可变参数列表形式),可能会在内部对参数进行处理后调用execve来完成进程替换的核心功能。- 参数处理方式的不同
execve的参数包含要执行的程序文件路径、传递给新程序的命令行参数数组以及环境变量数组。这种参数形式与其他exec函数有所不同。- 像
execl函数,它的参数是以可变参数列表的形式,最后以NULL结尾,这种形式在使用上有一定的便利性,但在底层实现中可能需要更多的转换工作才能与系统调用接口对接,而execve的参数形式更直接地反映了系统调用的需求。- 安全和权限方面的考虑
- 由于
execve是直接进行进程替换的底层函数,在安全和权限管理方面有着重要的作用。它对可执行文件的路径、执行权限等有着严格的要求。- 当调用
execve时,系统会根据文件的权限设置(如是否可执行、所属用户和组等)以及当前进程的权限来判断是否允许进程替换操作。这种严格的权限检查有助于保障系统的安全性。- 与内核交互的特点
execve在与内核交互时,需要将新程序的代码和数据加载到当前进程的地址空间,同时更新进程的各种状态信息,如程序计数器、堆栈指针等。这个过程涉及到内核中的进程管理、内存管理等多个模块的协同工作。- 相比其他
exec函数,execve在与内核的这种深度交互方面更为直接,因为其他函数可能会在调用execve之前进行一些额外的参数处理或环境设置。
exec函数族调用关系如下:

相关文章:
Linux笔记---进程:进程替换
1. 进程替换的概念 进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。 这种技术通常用于在不创建新进程的情况下,改变进程的行为。 我们之前谈到过for…...
量化交易backtrader实践(五)_策略综合篇(1)_股票软件指标回测
在第三章6到9节,我们学习和实践了大部分股票软件指标,且这些指标是backtrader内置指标实践中没有讲到过的。然后,在进行策略综合之前,我们先热个身,把一些可能比较有参考意义的股票软件内置指标在backtrader里给实现了…...
4.STM32通信接口之SPI通信(含源码)---软件SPI与W25Q64存储模块通信实战《精讲》
经过研究SPI协议和W25Q64,逐步了解了SPI的通信过程,接下来,就要进行战场实战了!跟进Whappy步伐! 目标:主要实现基于软件的SPI的STM32对W25Q64存储写入和读取操作! 开胃介绍(代码基本…...
MINDAGENT:游戏交互中的新兴性设计
一、摘要 1.问题/研究背景 LLM具有在多智能体系统中执行复杂调度的能力,并可以协调这些代理以完成需要广泛合作的复杂任务。 但是,目前还没有一个标准的游戏场景和相关的测试指标来评估 LLM 在游戏中的表现以及与人类玩家的合作能力。 2.研究目标/动…...
【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)
一、包含指标: 股票代码 股票代码 股票简称 年份 所属城市 直辖市:企业所在地是否属于直辖市。1是,0否。 副省级城市:企业所在地是否属于副省级城市。1是,0否。 省会城市&a…...
C# 动态类型 Dynamic
文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...
Css动画:旋转相册动画效果实现
🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…...
Unity 基于Collider 组件在3D 物体表面放置3D 物体
实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...
Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount
目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …...
PyQt 中的无限循环后台任务
在 PyQt 中实现一个后台无限循环任务,需要确保不会阻塞主线程,否则会导致 GUI 无响应。常用的方法是利用 线程(QThread) 或 任务(QRunnable 和 QThreadPool) 来运行后台任务。以下是一些实现方式和关键点&a…...
5G CPE核心器件-基带处理器(三)
5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…...
鸿蒙next版开发:拍照实现方案(ArkTS)
文章目录 拍照功能开发步骤1. 导入相关接口2. 创建会话3. 配置会话4. 触发拍照5. 监听拍照输出流状态 结语 在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是拍照功能。本文将详细介绍如何在ArkTS中实现拍照功能,并提供代码…...
C++面试突破---C/C++基础
1.C特点 1. C在C语言基础上引入了面对对象的机制,同时也兼容C语言。 2. C有三大特性(1)封装。(2)继承。(3)多态; 3. C语言编写出的程序结构清晰、易于扩充,程序可读性好。…...
项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...
每日算法一练:剑指offer——树篇(4)
1.计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -&…...
Nginx静态资源配置
基本配置原则 明确资源目录:为不同类型的静态资源指定不同的路径,这样可以避免路径冲突,并且便于管理。正确设置文件权限:确保 Nginx 具有读取静态资源的权限。缓存优化:为静态资源设置缓存头(如 expires&…...
困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析
当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...
D3.js 初探
文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目,由于对最终呈现的…...
linux常用指令 | 适合初学者
linux常用指令 1.ls: 列出当前,目录中的文件和子目录 ls 2.pwd: 显示当前工作目录的路径 pwd3.cd切换工作目录 cd /path/to/director4.mkdir:创建新目录 mkdir directory_name5.rmdir:删除空目录 rmdir directory_name6.rm: 删除文件或目录 rm file_name r…...
用 NotePad++ 运行 Java 程序
安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
