进程程序替换与exec系统调用

news2024/7/5 0:07:28

进程程序替换

进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数,例如execlexecvexecleexecve等。它们的共同特点是当当前进程执行到该函数时,就会直接跳转到新的程序并开始执行新的可执行文件。

exec系统调用

所以我们要想知道怎样进行进程程序替换就要先会使用exec系统调用,而且exec系统调用的家族函数只要掌握了一个,其他的也就大差不差了。

  • 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
  • 如果调用出错则返回-1
  • 所以exec函数只有出错的返回值而没有成功的返回值。

所以就先详细的讲一下execl函数。

execl系统调用函数

#include <unistd.h>

int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);

该函数接受可执行文件的路径(path)以及一系列的参数(arg0argn),最后以一个空指针(char *)0结尾。arg0代表可执行文件本身(即argv[0]),arg1argn是命令行参数。

代码示例

int main()
{
    cout<<"before execl"<<endl;//执行前
    execl("/usr/bin/ls","ls","-l","-a",NULL);//必须以空结束
    cout<<"after execl"<<endl;//执行后
    
    return 0;
}

 我们不难发现我们自己写的一个可执行程序运行的时候,在调用execl函数时会执行新的命令(可执行程序文件)而且在执行完成之后就直接结束了,并没有执行我们自己写的可执行程序的后续操作。就相当于在代码中调用其他程序。所以可以初步得出:execl函数成功执行时,当前进程将被替换为指定的可执行文件,并从该文件开始执行。注意,execl函数不会创建新的进程,而是将当前进程替换为新的可执行文件。

函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。

如果调用出错则返回-1
所以exec函数只有出错的返回值而没有成功的返回值。

执行原理

当我们运行我们的可执行程序时,该程序就已经变成了进程了,所以自然就少不了进程PCB以及进程地址空间和页表,和代码数据所映射的物理内存。但是当我们执行到execl函数时,就要开始执行一个已有的全新程序(并不创建进程),而该已有的程序(文件)自然存在磁盘当中,所以我们运行这个新的程序时就要将程序加载进内存。但是关键的是该新程序中的代码和数据并不是另存的,而是直接以覆盖式的存放在原进程的代码和数据所在物理内存中对应的位置,并继续从新程序的启动例程开始执行

以上就是单进程程序替换的过程

多进程的程序替换 

int main()
{
    pid_t i=fork();
    if(i==0)//子进程
    {    

        cout<<"before execl,"<<"mypid:"<<getpid()<<endl;
        execl("/usr/bin/ls","ls","-l","-a",NULL);//必须以空 结束
        cout<<"after execl,"<<"mypid:"<<getpid()<<endl;
    }
    else//父进程
    {
        pid_t ret=waitpid(-1,NULL,0);
        if(ret==i)
            cout<<"等待成功,"<<ret<<endl;
    }

    return 0;
}

我们知道开始我们就创建了一个子进程,而创建子进程的特点就是:数据独立以写时拷贝的方式存在,代码共享。而此时子进程执行execl函数,所以子进程就替换成了ls-a-l的一个程序,此时新程序的代码数据会覆盖在物理内存上。我们知道正常情况下父子进程数据发生改变时会以写时拷贝的方式另存空间,但是代码并不会。可是此时情况特殊,所以代码同样也会以写时拷贝的方式另存空间。归根结底还是:进程具有独立性

所以回到开始,为什么execl函数之后的代码不执行?其实就是程序替换,导致原进程的代码数据被新程序的代码数据覆盖,所以后续的代码自然就没有了,更不可能被执行。


其实我们的进程切换对语言是没要求的,可以自己随意地切换成其他语言的程序,不一定只切换成同语言的程序。

程序替换总结

程序替换是指将当前运行中的进程完全替换为一个新的程序。简单来说,就是将当前进程的代码、数据和堆栈等内容替换为新程序的代码、数据和堆栈。

当一个进程执行程序替换时,原来进程的代码、数据和堆栈被新程序覆盖,然后开始执行新程序的代码。这意味着原来进程的运行状态、打开的文件、socket连接等都会丢失,并且无法恢复。新程序从main函数开始执行,其运行过程与原程序无关。


而且对于需要传环境变量的exec类系统调用函数而言,环境变量属于全局的字符指针数组类型的变量environ,而且一个进程的环境变量是源于其父进程的环境变量,也就是说子进程会继承父进程的环境变量。不仅仅是创建子进程时会继承环境变量和命令行参数,而对于进程切换时也是会继承下来的。而对于进程替换而言原进程会采用覆盖环境变量内容的方式让新的进程继承下来,也就是说如果原进程调用函数接口时传入的环境变量是自己写的环境变量的话,那么切换的新进程会将原进程的环境变量里的内容继承下来。但是如果不想覆盖式传递的话可以采用putenv(char* env_val)函数在原环境变量表里去添加新的环境变量env_val,此时就不会清空原环境变量里的内容,而是添加内容后的环境变量传递给新的进程main函数的第三个参数当中。

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

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

相关文章

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

mmdet 3.x 打印各类指标

和mmdet2.x中的修改地方不一样&#xff0c;在mmdet/evaluation/metrics/coco_metric.py中第72行将classwise设为True就可以打印各类指标了 但是在test的时候一直都是什么指标都不打印&#xff0c;不管是上面总的指标还是下面的各类指标&#xff0c;暂时不知道怎么处理 找到原因…

二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

在软件设计的世界中&#xff0c;有一种设计模式以其简洁而强大的特性闪耀着光芒&#xff0c;它就是——观察者模式&#xff08;Observer Pattern&#xff09;。这个模式它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;为我们创造…

高斯积分-Gaussian Quadrature

https://mathworld.wolfram.com/GaussianQuadrature.html

pyinstaller 打包pyqt6等ui文件为exe可执行程序的方法

刚开始使用auto-py-to-exe打包pyqt6的程序&#xff0c;折腾好半天都会出错&#xff0c;关键打包出来的exe单文件有快100兆了&#xff0c;真大啊&#xff01; auto-py-to-exe有图形界面&#xff0c;看起来比较直观。 还有中文语言&#xff0c;对使用者比较友善&#xff0c;可以…

大数据研发工程师课前环境搭建

大数据研发工程师课前环境搭建 第一章 VMware Workstation 安装 在Windows的合适的目录来进行安装&#xff0c;如下图 1.1 双击打开 1.2 下一步&#xff0c;接受协议 1.3 选择安装位置 1.4 用户体验设置 1.5 快捷方式 已经准备好安装&#xff0c;点击安装 1.6 安装中 1.7 安装…

linux基本指令总结--文件和目录

前言&#xff1a; 想要学好Linux操作系统&#xff0c;理解并熟悉一些基本的指令是必要的&#xff0c;下面我将整理出关于文件和目录操作的一些基本指令和用法&#xff0c;我的linux环境部署在服务器端&#xff0c;使用xshell软件进行远程操作。 本章指令整合&#xff1a; ls查…

【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Mask Decoder

论文&#xff1a;Segment Anything   代码&#xff1a;https://github.com/facebookresearch/segment-anything 系列篇&#xff1a;   &#xff08;1&#xff09;【技术追踪】SAM&#xff08;Segment Anything Model&#xff09;代码解析与结构绘制之Image Encoder   &am…

如何在el-tree懒加载并且包含下级的情况下进行数据回显-01

在项目中做需求&#xff0c;遇到一个比较棘手的问题&#xff0c;el-tree懒加载在包含下级的时候&#xff0c;需要做回显&#xff0c;将选中的数据再次勾选上&#xff0c;在处理这个需求的时候有两点是比较困难的&#xff1a; el-tree是懒加载的&#xff0c;包含下级需要一层一…

DPDK初始化

rte_eal_init │ ├──rte_cpu_is_supported&#xff1a;检查cpu是否支持 │ ├──rte_atomic32_test_and_set&#xff1a;操作静态局部变量run_once确保函数只执行一次 │ ├──pthread_self() 获取主线程的线程ID,只是用于打印 │ ├──eal_reset_internal_config&#x…

Python 利用PIL由多张图片合成gif动画

Python 由多张图片合成gif动画 案例 import os figure_save_path "file_fig_test" import warnings warnings.filterwarnings("error") import numpy as np np.random.seed(0) import matplotlib.pyplot as plt from PIL import Image import timenum 1…

​软考-高级-系统架构设计师教程(清华第2版)【第16章 嵌入式系统架构设计理论与实践(P555~613)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第16章 嵌入式系统架构设计理论与实践&#xff08;P555~613&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

将ArduinoIDE库文件移动到其他磁盘的方法

本文主要介绍更改软件包位置Arduino IDE &#xff08;含2.0以上版本&#xff09;的方法。 Arduino IDE 默认将软件包安装到 C 盘&#xff0c;如果你使用的开发板较多&#xff0c;产生的库文件很大&#xff0c;会导致 C 盘可用空间不足&#xff0c;博主只用了ESP开发板&#xf…

GCD:异步同步?串行并发?一文轻松拿捏!

GCD 文章目录 GCD进程线程进程与线程的关系进程与线程的区别 任务&#xff08;执行的代码&#xff09;队列线程与队列的关系 队列任务**同步执行任务&#xff08;sync&#xff09;**辅助方法**异步执行任务&#xff08;async)**总结栅栏任务迭代任务 队列详细属性QoSAttributes…

CF1899 G. Unusual Entertainment [二维数点/二维偏序]

传送门:CF [前题提要]:没什么好说的,区域赛爆炸之后发愤加训思维题.秒了div3 A~F的脑筋急转弯,然后被G卡了,树剖dfs序的想法已经想到了,题目也已经化简为两个线段是否存在一个合法位置了.但是MD不会二维数点,用一个树剖扫描线搞来搞去最后还是Tle.果然如下图所说:科技还是十分…

掌握未来技术趋势,Python编程引领人工智能时代

掌握未来技术趋势&#xff0c;Python编程引领人工智能时代 摘要&#xff1a;Python作为一种高级编程语言&#xff0c;在人工智能领域中扮演着越来越重要的角色。本文将通过介绍Python编程的特点、应用场景及发展前景&#xff0c;展望Python未来的发展趋势&#xff0c;并结合代…

搭建mysql主从错误集合

1 mysqld --verbose --help --log-bin-index/tmp/tmp.Frnt2oibYI mysqld: Cant read dir of /etc/mysql/conf.d/ my.cnf是在/etc/mysql/conf.d/文件夹下&#xff0c;所以挂载的时候不要写/etc/mysql 2 COLLATION utf8_unicode_ci is not valid for CHARACTER SET latin1 配…

Windows10下Maven3.9.5安装教程

文章目录 1.下载maven2.安装3.配置系统变量3.1.新建系统变量 MAVEN_HOME3.2.编辑系统变量Path 4.CMD命令测试是否安装成功5.配置maven本地仓库6.配置国内镜像仓库 1.下载maven 官网 https://maven.apache.org/download.cgi 点击下载。 2.安装 解压到指定目录 D:\installSoft…

springcloudalibaba-3

一、Nacos Config入门 1. 搭建nacos环境【使用现有的nacos环境即可】 使用之前的即可 2. 在微服务中引入nacos的依赖 <!-- nacos配置依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-…