首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Linux】进程替换

进程程序替换 1、代码展示效果 首先先使用execl函数,这个比较的简单,所以我们先看这样的代码 为什么我们执行我们的程序,最后跑起来的确实ls的命令?...所以execl的作用是让我们(进程)用exec*函数,执行起来新的程序。 会替换掉原本的程序,执行我们新调用的程序。...此时的进程的替换并没有创建新的进程,只不过是直接用老的进程的页表来指向后来调用的代码和数据。 站在被替换的代码和数据角度来看:本质就是这个程序被加载到内存了。 怎么加载?...所以exec类似于一种Linux上的加载进程。...程序替换带来的意义! 其中数据的写时拷贝是之前的在同一个进程的运行时候会发生的事情。但是呢,像现在这个样子的时候,我们的子进程执行的代码和原来已经相差很大了,那么现在该怎么进行呢?

8110

Linux:进程替换

一、进程替换         为什么要有进程替换呢???比方说我们想用fork创建一个子进程去帮助我们完成一个工作,这个工作我们需要封装成一个函数去使用,但难道我们每次都要自己写一个函数吗?...所以所谓的进程替换 就是为了让父进程和子进程执行不同的代码!! ...这就是发生了进程替换!! 1.2 进程替换的原理  所以究竟是如何做到在没有if eles的情况下让父子进程执行不同的代码呢??...所以并没有创建新的子进程,只是将该子进程的代码和数据替换了,并且内核数据结构PCB并没有释放,而仅仅只是修改了某些字段的内容。 问题2:子进程的代码和数据被替换了,为什么父进程还是执行原来的代码??...所以进程替换中,环境变量信息不会被替换!!

13410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】进程替换

    今日更新了Linux的进程替换的内容 欢迎大家关注点赞收藏⭐️留言 进程程序替换 代码和现象 运行后,发现使用了ls命令,而且打印end的语句也不见了。...exec*函数的作用:让进程通过exec*函数把全新的程序替换到自己对应的代码和数据,然后执行新的程序。 exec*函数执行完毕后,后续的代码不见了,因为被替换了。...进程=内核数据结构+代码和数据 替换的意义是:内核数据结构不变,个别属性可能会变,用新程序的代码代替老程序的代码。 进程的替换没有创建新的进程!所以调用exec*前后该进程的id并未改变。...\n"); 28 return 0; 29 } 运行结果如上图, 进程替换成功了,父进程也等待成功。上面是用fork创建子进程,让子进程去替换,让子进程完成任务,而不改变父进程。...这也是进程替换的重要意义。

    8710

    【Linux】进程程序替换

    Linux进程程序替换也是Linux进程中非常重要的部分。我们将从什么是Linux进程程序替换,为什么要有Linux进程程序替换,以及如何实现Linux进程程序替换(原理)三个方面展开讲解。...想要弄明白为什么要有进程程序替换,我们首先要知道父进程创建子进程的目的是什么?想要子进程完成什么样的任务? 想让子进程执行父进程代码的一部分。...(这就是我们所讲的进程程序替换) 一.什么是进程程序替换 进程程序替换顾名思义,就是将其他程序替换过来继续执行,主要是通过exec* 这类函数来帮助我们替换,直接来学这类函数。...进程替换的时候,有没有创建新的进程? 没有,进程替换仅仅将物理内存中的代码和数据做了替换。虚拟内存和PCB表没有发生任何改变。...2.多进程 在理解单进程程序替换的基础上,多进程的程序替换就容易理解了。 我们先要达成一个共识:写时拷贝这种机制,不仅仅是对数据,对代码也有写时拷贝策略。

    10410

    初识Linux · 进程替换

    前言: 由前面的章节学习,我们已经了解了进程状态,进程终止以及进程等待,今天,我们学习进程替换。...2 解释原理 首先我们要清楚一个问题,进程替换的全名不是进程替换,替换的不是进程,是程序,所以在进程程序替换的这个过程,本质上是没有创建新的进程的。...第一个点:进程程序替换中是没有创建新进程的,无非是程序替换了PCB里面原来的数据。...exec函数本质是一个加载函数,因为有了exec函数,在Linux中就可以将程序加载进去,因为进程程序替换的本质就是将不同的程序加载到内存里面,加载靠的就是exec*函数。...3 将代码改成多进程版本 将代码改成多线程版本,我们要做的事就是,父进程创建子进程,创建了之后,子进程执行被替换的程序,父进程只需要等待多个子进程就可以了。

    9510

    【linux】进程等待与进程替换

    02.进程替换 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。...执行起来新的程序 main 函数演示了如何使用 execl 函数进行进程替换。...失败的原因可能包括指定的程序不存在,或者进程没有执行该程序的权限等。 execl函数的返回值可以不关心了。只要替换成功,就不会向后继续运行只要继续运行了,一定是替换失败了!...这个程序结构清晰,展示了进程的创建、执行替换、等待及状态检查的完整流程,是学习 Unix/Linux 系统编程的一个很好的实例。

    7510

    Linux进程控制——Linux进程程序替换

    前言:Linux进程控制包含了进程终止,进程等待,进程程序替换。走到现在我们也只剩下进程程序替换没介绍了,那么让我们来看看进程程序替换到底是什么!...本篇主要内容: 替换原理 替换函数 实现简易shell 我们所创建的所有的子进程,执行的代码,都是父进程代码的一部分,如果我们想让子进程执行新的程序,执行全新的代码和访问全新的数据,不在和父进程有瓜葛这就要用到我们的进程替换了...替换函数 在进程程序替换中,替换函数必不可少,让我们来看看这类函数!...,因为我们用任意语言写的程序都会变成进程,只要是进程就都可以用exec*来替换——系统大于一切 4....总结 进程程序替换能够让我们只用C语言就可以调用其他任何语言去执行,极大程度上带来了便利,也可以帮助我们完成很多任务,好了,关于Linux进程控制我们先了解到这,下次我们将进入新的章节!

    9910

    Linux进程控制【进程程序替换】

    ---- 前言 子进程 在被创建后,共享的是 父进程 的代码,如果想实现自己的逻辑就需要再额外编写代码,为了能让 子进程 执行其他任务,可以把当前 子进程 的程序替换为目标程序,此时需要用到 Linux...进程程序替换相关知识 子进程 替换为其他程序后,无法再执行原有程序,但 进程 始终为同一个 火爆全网的 ChatGTP 能否替换 “人类” ?...等指令时后,bash 会创建子进程,将其替换为对应的指令程序并执行任务,就能实现各种指令 进程程序替换图解 Linux 中的指令都是用 C语言 写的可执行程序,所以可以进行替换 bash 运行后,输入...,因为不能影响到父进程 ---- 总结 以上就是本篇关于 Linux 进程程序替换的相关内容了,在本文中,我们知道了进行程序替换的目的,学习使用了程序替换相关的七大函数,最后还观察了程序替换后的神奇现象...,在学完这些知识后,我们就可以实现一个简单的 bash,体验一下在自己程序中输入指令操控 Linux 的奇妙体验 如果你觉得本文写的还不错的话,期待留下一个小小的赞,你的支持是我分享的最大动力!

    25920

    【Linux】进程的程序替换

    程序替换 1.创建子进程的目的是什么? 目标:为了让子进程帮父进程执行特定的任务 具体做法:1....,父进程通过if判断分流让子进程去跑了 2.创建一个子进程不执行父进程的代码,而是让子进程在磁盘当中执行全新的程序,这种操作称之为进程的程序替换 2.了解程序是如何进行替换的 程序替换函数 execl...ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux...,用当前进程的数据替换老进程的数据段 ---- 站在进程的角度 进程的程序替换有没有创建新的进程呢?...,让子进程调用execl,在调用execl把代码和数据加载到内存 所以当创建进程的时候,先有进程数据结构,再加载代码和数据 程序替换是整体替换,不是局部替换 修改test.c文件内容如下 #include

    2K30

    【Linux】详解进程程序替换

    一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...二、子进程进行程序替换 通过子进程进行程序替换可以让子进程帮我们去做一部分工作,而且子进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。...<< endl; cout Linux!" << endl; cout Linux!"...\n"); return 0; }  执行结果如下,证明了我们不仅仅可以替换子进程执行系统程序,还可以替换子进程执行我们的程序。...无论是什么语言,只要能在Linux系统下跑,都可以用exec系列的接口进行程序替换,exec系列的接口只认二进制代码和数据。

    9410

    【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    1.进程创建 1.1 fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。.../a.out #等20秒退出 child exit code:10 [root@localhost linux]# ....\n"); return 1; } } return 0; } 运行结果: 4.进程程序替换 4.1 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支...当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。...所以要写一个shell,需要循环以下过程: 获取命令行 解析命令行 建立一个子进程(fork) 替换子进程(execvp) 父进程等待子进程退出(wait) 根据这些思路,和我们前面的学的技术,就可以自己来实现一个

    16510

    【Linux】开始学习进程替换吧!

    —— 尾田荣一郎《海贼王》 开始学习进程替换吧 1 前言 通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!...2 进程替换 2.1 替换函数 进程替换有六种以exec开头的函数,统称exec函数: #include ` int execl(const char *path, const char...我们知道 进程 = 内核数据结构 + 代码和数据 ,替换就是用新进程的代码与数据替换之前的代码与数据,注意不改变pid哦! 站在被替换进程的角度:本质就是这个程序别加载到内存里了!!!...exec* 就类似一个Linux 上的加载函数。 而且我们不用关心exec*函数的返回值,只要替换成功了,就不会向后运行(也就用不到它的返回值了),只要继续运行那一定就是替换失败了!!!...,然后在子进程中进行进程替换。

    9210

    【Linux】进程理解与学习-程序替换

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念...【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 【Linux】进程理解与学习Ⅳ-进程地址空间 【Linux】进程控制(创建、终止、等待) --------...下的shell--BASH 【Linux】进程优先级&前后台理解 前言 在前文,我们学习了fork函数创建子进程,而创建子进程主要就是为了让它帮我们执行特定的任务。...(这里注意的是,程序替换是实现的代码与数据的整体替换)  那么这里不仅有一个问题:在进程替换时,有没有产生新的进程呢?...当然我们也可以通过代码来验证一下: ​ 多进程对应的程序替换 当然,假如我们使用fork创建子进程,让子进程完成程序替换,子进程的程序替换并不会影响父进程,这是因为父子进程都有各自独立的PCB,并且由于写时拷贝机制的存在

    1.1K30

    Linux:进程控制(二.详细讲解进程程序替换)

    (例如在程序里使用ls之类的指令)就可以使用进程程序替换,一开始我们先只看单进程的情况。...后面在引入多进程的情况 1.1概念 进程程序替换是指在运行过程中将一个进程的地址空间中的代码、数据和堆栈等内容完全替换为另一个程序的代码、数据和堆栈的过程。...1.3使用一个exec 系列函数 execl()函数 execl函数是Linux系统中用于执行新程序的函数之一,它属于exec函数族的一部分。...把数据从一个硬件搬到另一个硬件,只有操作系统能做 2.多进程时的程序替换 我们可以创建一个子进程,由子进程来进行程序替换,父进程来等待结果就可以。为什么?...父进程能得到子进程的执行结果 我们知道父进程与子进程映射到同一块代码,那么子进程进行程序替换后,不是会覆盖吗,替换为什么不影响父进程?

    22110

    【Linux】进程控制:理解什么是进程创建,进程终止,进程等待 | 进程替换

    单进程的进程替换 在理解什么是进程替换之前,我们先来看看进程替换怎么使用,下面是操作系统提供的进程替换的一些函数 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。...进程替换的原理: 进程在替换时,只会替换掉物理内存中原来程序的代码和数据,其它的并不会动,且调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。...那么环境变量也是数据,它会被替换吗? 不会!!因为创建子进程的时候,环境变量已经被子进程继承下去了,所以进程替换不会替换环境变量。...多进程的进程替换  前面的例子是单进程的执行系统命令的进程替换,接下来我们实现一个多进程的执行自己命令的进程替换。...因为在linux中,环境变量的内容是在一个区域放着的,而环境变量表 env 中存的是环境变量的地址,这些地址指向所对应的环境变量;         而我们putenv一个环境变量时,其实是在环境变量表中找一个未使用的下标

    33810

    【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    将子进程添加到系统进程列表中,实际上是通过一张哈希表来完成的,Linux利用hash表来管理进程,指向PCB的指针会存到pidhash里面,然后在通过pid_hashfn哈希函数,将进程的pid转换为hash...其实是因为没有刷新缓冲区的东西,所以即使hello Linux已经加载到缓存区,也不会立即打印出来,而是等到睡眠之后调用exit结束的时候,才将缓冲区刷新,才会打印出来hello Linux。...2.进程的程序替换 2.1 单个进程的程序替换 下面函数参数中的…是可变参数列表,可以给C语言函数传递不同个数的参数。...下面是运行结果,子进程被替换为ls进程,ls进程正常退出退出码为0,终止信号为0. 故意使得程序替换失败,则进程退出也是按照我们设定的退出码所退出的。 3.程序替换原理 1....当父进程派生的子进程发生程序替换时,防止父子进程原先共享的代码段和数据段被修改,操作系统会进行写时拷贝,将代码段和数据段重新复制一份给子进程,让子进程程序替换之后,不会影响父进程。

    14.9K30

    【Linux进程控制】四、exec函数族——进程替换详解

    进程替换的概念 我们在使用fork()系统调用之后,创建出来的子进程是对父进程的复制,也就是说子进程和父进程执行的是相同的程序,虽然说父子进程可能执行的是不同的代码分支(if else语句),但是程序流程是一样...我们要想在新创建的子进程中执行其他程序,需要调用一种exec函数来拉起一个新的进程。当进程调用一种exec函数的时候,该进程的用户空间代码和数据全部被新程序替换掉,从新程序的启动例程开始执行。...需要注意的是,调用exec并不会创建新进程,而是一种进程替换,所以调用exec前后,进程本身的ID不会改变。...用新的进程映像替换原来的进程映像。...这里面重要的是前两个execl和execlp函数,它们都用于使用一个新的进程去替换原来的进程,也就是在新创建的进程中执行其他程序。

    18610

    【Linux系统编程】八、进程程序替换

    所以 进程替换是为了让子进程能够执行其它程序的代码;进程替换就是以写时拷贝的策略,让第三方进程的代码和数据替换到父进程的代码和数据,给子进程用,因为进程间具有独立性,所以不会影响父进程。...但是接下来要把其它程序的代码通过进程替换放在内存里让子进程与之关联,此时就要给代码进行写时拷贝。...进程替换的原理 ​ 程序替换的本质:用磁盘指定位置上的程序的代码和数据,覆盖进程自身的代码和数据,达到让进程执行指定程序的目的。 ​...当进程调用一种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行(也就是说替换后原进程后面的代码就被覆盖了,不会再被执行)。...所以 exec* 在 linux 中也称为 加载器! ​ 一个完整的集成开发环境的组件肯定包括编辑器、编译器、调试器、加载器等。

    4400

    进程程序替换

    快速了解进程程序替换 让我们通过一个简单的例子快速理解进程程序替换的核心概念: #include #include int main() { printf...printf输出正常显示 ls -l的输出直接出现在终端 程序在exec成功后不会继续执行后续代码 深入原理:进程替换的底层机制 替换过程示意图 核心原理: 地址空间替换:新程序完全替换当前进程的代码段...**进程 = 内核数据结构 + 代码和数据 ,**也就是将代码和数据部分进行替换,但是PCB大部分不变,页表小部分映射关系可能会调整。...保留上下文: 进程ID(PID)保持不变 文件描述符表继承 信号处理设置保留 进程优先级维持不变 执行流程: 新程序从main函数开始执行 原程序exec之后的代码永远不会执行 替换失败返回..., NULL}; execve("/bin/bash", args, new_env); 使用man 2查询,说明是系统级函数 其他的exec函数是通过语言封装的系统调用,使用man 3查询 Linux

    2900
    领券