当前位置: 首页 > news >正文

Linux笔记---进程:进程替换

1. 进程替换的概念

进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。

这种技术通常用于在不创建新进程的情况下,改变进程的行为。

我们之前谈到过fork函数,这个函数可以启动一个子进程,子进程继承了父进程的代码和数据。

在谈到进程替换之前,我们只能通过判断fork函数的返回值id来区分父子进程,并让二者运行不同的分支。而利用进程替换技术,我们可以将子进程的代码数据完全替换为另一个程序,实现我们所期望的,父子进程完全独立为两个不同的进程。

进程替换的原理

进程替换的原理涉及到操作系统的内存管理和进程控制。当一个进程调用exec系列函数时,操作系统会将新程序的代码和数据加载到内存中,并将其与当前进程的地址空间相关联。这个过程通常涉及到以下几个步骤:

  1. 加载新程序:操作系统将新程序的可执行文件从磁盘加载到内存中。
  2. 替换代码和数据:新程序的代码和数据会替换当前进程的代码和数据段。
  3. 更新进程状态:进程的状态会被更新,以反映新程序的执行状态。
  4. 执行新程序:进程开始执行新程序的入口点,通常是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函数的特殊性:

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

 exec函数族调用关系如下:

相关文章:

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…...

量化交易backtrader实践(五)_策略综合篇(1)_股票软件指标回测

在第三章6到9节&#xff0c;我们学习和实践了大部分股票软件指标&#xff0c;且这些指标是backtrader内置指标实践中没有讲到过的。然后&#xff0c;在进行策略综合之前&#xff0c;我们先热个身&#xff0c;把一些可能比较有参考意义的股票软件内置指标在backtrader里给实现了…...

4.STM32通信接口之SPI通信(含源码)---软件SPI与W25Q64存储模块通信实战《精讲》

经过研究SPI协议和W25Q64&#xff0c;逐步了解了SPI的通信过程&#xff0c;接下来&#xff0c;就要进行战场实战了&#xff01;跟进Whappy步伐&#xff01; 目标&#xff1a;主要实现基于软件的SPI的STM32对W25Q64存储写入和读取操作&#xff01; 开胃介绍&#xff08;代码基本…...

MINDAGENT:游戏交互中的新兴性设计

一、摘要 1.问题/研究背景 LLM具有在多智能体系统中执行复杂调度的能力&#xff0c;并可以协调这些代理以完成需要广泛合作的复杂任务。 但是&#xff0c;目前还没有一个标准的游戏场景和相关的测试指标来评估 LLM 在游戏中的表现以及与人类玩家的合作能力。 2.研究目标/动…...

【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)

一、包含指标&#xff1a; 股票代码 股票代码 股票简称 年份 所属城市 直辖市&#xff1a;企业所在地是否属于直辖市。1是&#xff0c;0否。 副省级城市&#xff1a;企业所在地是否属于副省级城市。1是&#xff0c;0否。 省会城市&a…...

C# 动态类型 Dynamic

文章目录 前言1. 什么是 Dynamic&#xff1f;2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...

Css动画:旋转相册动画效果实现

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展&#xff0c;网页不再局限于静态展示&#…...

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 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 中实现一个后台无限循环任务&#xff0c;需要确保不会阻塞主线程&#xff0c;否则会导致 GUI 无响应。常用的方法是利用 线程&#xff08;QThread&#xff09; 或 任务&#xff08;QRunnable 和 QThreadPool&#xff09; 来运行后台任务。以下是一些实现方式和关键点&a…...

5G CPE核心器件-基带处理器(三)

5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…...

鸿蒙next版开发:拍照实现方案(ArkTS)

文章目录 拍照功能开发步骤1. 导入相关接口2. 创建会话3. 配置会话4. 触发拍照5. 监听拍照输出流状态 结语 在HarmonyOS 5.0中&#xff0c;ArkTS提供了一套完整的API来管理相机功能&#xff0c;特别是拍照功能。本文将详细介绍如何在ArkTS中实现拍照功能&#xff0c;并提供代码…...

C++面试突破---C/C++基础

1.C特点 1. C在C语言基础上引入了面对对象的机制&#xff0c;同时也兼容C语言。 2. C有三大特性&#xff08;1&#xff09;封装。&#xff08;2&#xff09;继承。&#xff08;3&#xff09;多态&#xff1b; 3. C语言编写出的程序结构清晰、易于扩充&#xff0c;程序可读性好。…...

项目搭建+修改

一 : 在列表成功回调函数,追加数据中,添加修改的按钮 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.计算二叉树的深度 某公司架构以二叉树形式记录&#xff0c;请返回该公司的层级数。 示例 1&#xff1a; 输入&#xff1a;root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4&#xff0c;沿着路径 1 -> 2 -> 3 -&…...

Nginx静态资源配置

基本配置原则 明确资源目录&#xff1a;为不同类型的静态资源指定不同的路径&#xff0c;这样可以避免路径冲突&#xff0c;并且便于管理。正确设置文件权限&#xff1a;确保 Nginx 具有读取静态资源的权限。缓存优化&#xff1a;为静态资源设置缓存头&#xff08;如 expires&…...

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析

当电脑提示“mfc140u.dll丢失”时&#xff0c;这可能会导致某些程序无法正常运行&#xff0c;给用户带来不便。不过&#xff0c;有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题&#xff0c;教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...

D3.js 初探

文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目&#xff0c;由于对最终呈现的…...

linux常用指令 | 适合初学者

linux常用指令 1.ls: 列出当前&#xff0c;目录中的文件和子目录 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 窗口, 且路…...

在 Linux 环境下搭建 OpenLab Web 网站并实现 HTTPS 和访问控制

实验要求 综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c…...

微信小程序wx.showShareMenu配置全局分享功能

在app.js文件中配置如下即可&#xff1a; onLaunch() {//开启分享功能this.overShare()},/*** 开启朋友圈分享功能* 监听路由切换/自动执行*/overShare() {wx.onAppRoute((res) > {// console.log(route, res)let pages getCurrentPages()let view pages[pages.length - …...

机器学习面试八股总结

下面是本人在面试中整理的资料和文字&#xff0c;主要针对机器学习面试八股做浅显的总结&#xff0c;大部分来源于ChatGPT&#xff0c;中间有借鉴一些博主的优质文章&#xff0c;已经在各文中指出原文。有任何问题&#xff0c;欢迎随时不吝指正。 文章系列图像使用动漫 《星游…...

南京邮电大学《2024年812自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《南京邮电大学812自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

大数据新视界 -- Hive 数据湖集成与数据治理(下)(26 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Android EventBus最全面试题及参考答案

目录 什么是 EventBus&#xff1f; 请解释 EventBus 是什么&#xff0c;以及它的工作原理。 简述 EventBus 的工作原理。 EventBus 的主要组成部分有哪些&#xff1f; EventBus 是如何实现发布订阅模式的&#xff1f; EventBus 与观察者模式有什么区别&#xff1f; Even…...

C++ 游戏开发:开启游戏世界的编程之旅(1)

在游戏开发领域&#xff0c;C 一直占据着极为重要的地位。它以高效的性能、对底层硬件的良好控制能力以及丰富的库支持&#xff0c;成为众多大型游戏开发项目的首选编程语言。今天&#xff0c;就让我们一同开启 C 游戏开发的探索之旅。 一、C 游戏开发基础 &#xff08;一&am…...

SpringBoot mq快速上手

1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.示例代码 基础信息配置 package com.example.demo.config;import org.springframework.amqp.co…...

图像处理网络中的模型水印

论文信息&#xff1a;Jie Zhang、Han Fang、Weiming Zhang、Wenbo Zhou、Hao Cui、Hao Cui、Nenghai Yu&#xff1a;Model Watermarking for Image Processing Networks 本文首次提出了图像处理网络中深度水印问题&#xff0c;将知识产权问题引入图像处理模型 提出了第一个深…...

Halcon 瑕疵检测原理及应用

摘要&#xff1a; 本文详细阐述了 Halcon 在瑕疵检测领域的原理、相关技术以及广泛的应用场景。首先介绍了 Halcon 软件的基本概况及其在机器视觉领域的重要地位&#xff0c;接着深入剖析了瑕疵检测所涉及的图像采集、预处理、特征提取与分析以及分类与判定等核心原理&#xff…...