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

进程程序替换

进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了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函数的第三个参数当中。

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

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

相关文章

竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

美颜sdk是什么?美颜sdk技术解析与比较

美颜SDK的出现为开发者提供了快速实现高质量美颜效果的工具&#xff0c;然而&#xff0c;在众多美颜SDK中&#xff0c;技术实现和效果差异巨大。本文将对美颜SDK进行技术解析&#xff0c;并进行比较&#xff0c;以帮助开发者更好地选择适合其应用需求的美颜SDK。 一、美颜SDK…

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

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

视频剪辑技巧:简单步骤,批量剪辑并随机分割视频

随着社交媒体平台的广泛普及和视频制作需求的急剧增加&#xff0c;视频剪辑已经成为了当今社会一项不可或缺的技能。然而&#xff0c;对于许多初学者来说&#xff0c;视频剪辑可能是一项令人望而生畏的复杂任务。可能会面临各种困难&#xff0c;如如何选择合适的软件和硬件、如…

Vue3 shallowRef 和 shallowReactive

一、shallowRef 使用shallowRef之前需要进行引入&#xff1a; import { shallowRef } from vue; 使用方法和ref 的使用方法一致&#xff0c;以下是二者的区别&#xff1a; 1. 如果ref 和 shallowRef 都传入的是普通数据类型的数据&#xff0c;那么他们的效果是一样的&#x…

​软考-高级-系统架构设计师教程(清华第2版)【第18章 安全架构设计理论与实践(P648~690)-思维导图】​

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

【C++】chono库:使用及源码分析

文章目录 0. 概述1. duration1.1 分析std::chrono::duration_cast() 1.2 使用案例std::chrono::duration::count() 1.3 部分源码 2. time_point2.1 分析std::chrono::time_point_cast() 2.2 使用举例std::chrono::time_point::time_since_epoch() 2.3 部分源码 0. 概述 本篇文…

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

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

Python程序打包指南:手把手教你一步步完成

最近感兴趣想将开发的项目转成Package&#xff0c;研究了一下相关文章&#xff0c;并且自己跑通了&#xff0c;走了一下弯路&#xff0c;这里记录一下如何打包一个简单的Python项目&#xff0c;展示如何添加必要的文件和结构来创建包&#xff0c;如何构建包&#xff0c;以及如何…

纯CSS自定义滚动条样式

.my-carousel{height: 474px;overflow-y: auto; } /*正常情况下滑块的样式*/ .my-carousel::-webkit-scrollbar {width: 5px; } .my-carousel::-webkit-scrollbar-thumb {border-radius: 8px;background-color: #ccc; } .my-carousel::-webkit-scrollbar-track {border-radius:…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充&#xff0c;不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

Git企业开发级讲解(四)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…

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…

vue3基础学习

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

深入理解ResNet网络:实现与应用

Resnet 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是一种非常重要的模型&#xff0c;它在图像识别、目标检测等领域取得了显著的成果。然而&#xff0c;随着网络层数的增加&#xff0c;梯度消失和梯度爆炸问题变得越来越严重&#xff0c;导致训练深层…

OpenCV快速入门:图像滤波与边缘检测

文章目录 前言一、噪声种类与生成1.1 椒盐噪声1.2 高斯噪声1.3 彩色噪声 二、卷积操作2.1 卷积基本原理2.2 卷积操作代码实现 三、线性滤波3.1 均值滤波均值滤波原理均值滤波公式均值滤波代码实现 3.2 方框滤波方框滤波原理方框滤波公式方框滤波代码实现 3.3 高斯滤波高斯滤波原…

Matalab插值详解和源码

转载&#xff1a;Matalab插值详解和源码 - 知乎 (zhihu.com) 插值法 插值法又称“内插法”&#xff0c;是利用函数f (x)在某区间中已知的若干点的函数值&#xff0c;作出适当的特定函数&#xff0c;在区间的其他点上用这特定函数的值作为函数f (x)的近似值&#xff0c;这种方…

kernel32.dll下载地址分享,Kernel32.DLL文件丢失的修复指南

作为计算机用户&#xff0c;我们可能都曾遭遇过这样一条令人烦恼的错误信息&#xff1a; "程序无法启动&#xff0c;因为您的计算机中缺少Kernel32.dll"。在这种情况下&#xff0c;往往会引发一系列疑问&#xff1a; Kernel32.dll是什么&#xff1f;为什么它对我的电…

51.Sentinel微服务保护

目录 &#xff08;1&#xff09;初识Sentinel。 &#xff08;1.1&#xff09;雪崩问题及解决方案。 &#xff08;1.1.1&#xff09;雪崩问题。 &#xff08;1.1.2&#xff09;解决雪崩问题的四种方式。 &#xff08;1.1.3&#xff09;总结。 &#xff08;1.2&#xff09;…

c语言:模拟实现qsort函数

qsort函数的功能&#xff1a; qsort相较于冒泡排序法&#xff0c;不仅效率更快&#xff0c;而且能够比较不同类型的元素&#xff0c;如&#xff1a;浮点数&#xff0c;结构体等等。这里我们来模拟下qsort是如何实现这一功能的&#xff0c;方便我们对指针数组有一个更深层次的理…