【Linux】详解进程程序替换

这篇具有很好参考价值的文章主要介绍了【Linux】详解进程程序替换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、替换原理

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。程序替换所做的本质工作就是将代码和数据加载到内存。

        替换系统命令时命令行怎么写,参数就怎么传,参数以NULL结尾程序替换一旦成功,exec*后序的代码不再执行。因为原程序的数据和代码被替换掉了。exec*程序替换接口只有失败返回值,没有成功返回值。

二、子进程进行程序替换

        通过子进程进行程序替换可以让子进程帮我们去做一部分工作,而且子进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execl("/usr/bin/ls", "ls", "-l", NULL);
        exit(0);
    }

    pid_t rid = waitpid(id, NULL, 0);
    printf("wait success!\n");
    return 0;
}

2.1、让子进程执行我自己的程序

        我自己写了一个C++程序,向替换子进程帮我跑一下:

//C++程序
#include <iostream>
using namespace std;

int main()
{

    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;

    return 0;
}

 C程序:

//让子进程执行我自己写的程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execl("./mytest", "./mytest", NULL);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

        执行结果如下,证明了我们不仅仅可以替换子进程执行系统程序,还可以替换子进程执行我们的程序。 无论是什么语言,只要能在Linux系统下跑,都可以用exec系列的接口进行程序替换,exec系列的接口只认二进制代码和数据。

【Linux】详解进程程序替换,linux,运维,服务器,c语言

三、各种exec接口

【Linux】详解进程程序替换,linux,运维,服务器,c语言

【Linux】详解进程程序替换,linux,运维,服务器,c语言 其它六个接口在底层都封装了execve系统调用接口。

3.1、execlp 

【Linux】详解进程程序替换,linux,运维,服务器,c语言

        exec接口中,l意为list,表示参数列表,v意为vector,就指的是数组名字中带p的这个p指的是PATH,也就是说你不用告诉系统,程序在哪里,只要告诉我名字就行,系统会自动到你这个进程的PATH环境变量中所保存的路径中寻找。execlp只有第一个参数和execl不同,其余参数都相同。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execlp("ls", "ls", "-l", NULL);
        exit(0);
    }

    pid_t rid = waitpid(id, NULL, 0);
    printf("wait success!\n");
    return 0;
}

3.2、execv/execvp

【Linux】详解进程程序替换,linux,运维,服务器,c语言

【Linux】详解进程程序替换,linux,运维,服务器,c语言

        execv的用法与execl的用法大致相同,只不过将execl后面的可变参数列表换成一个指针数组。execvp也只是将execv前面的路径换成程序名而已。不过这里要强调的是:不要忘了路径最前面的那一个斜杠,还有数组的结束标志是NULL,一定要在数组的最后加上NULL

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        char* argv[] = {"ls", "-l", "-a", NULL};
        //execvp("ls", argv);
        execv("/usr/bin/ls", argv);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

3.3、execle/execvpe/execve

        程序替换不会替换环境变量数据可以通过地址空间继承的方法,让子进程拿到父进程的所有环境变量。如果我们想传递全新的环境变量表给子进程,就要使用带e的程序替换接口。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
         char* env[] ={"aaa=bbbbbbbbbbbbbbbb", NULL};
         execle("./mytest", "./mytest",NULL,  env);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

【Linux】详解进程程序替换,linux,运维,服务器,c语言文章来源地址https://www.toymoban.com/news/detail-855007.html

到了这里,关于【Linux】详解进程程序替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 在linux中fork是一个很重要的函数,它可以已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 fork函数返回两个值,一个是子进程的进程号(pid),另一个是0。 父进程可以通过pid来区分自己和子进程,子进程可

    2024年02月02日
    浏览(46)
  • [Linux]进程控制详解!!(创建、终止、等待、替换)

            hello,大家好,这里是bang___bang_,在上两篇中我们讲解了进程的概念、状态和进程地址空间,本篇讲解进程的控制!!包含内容有进程创建、进程等待、进程替换、进程终止!! 附上前2篇文章链接: Linux——操作系统进程详解!!(建议收藏细品!!)_bang___ba

    2024年02月15日
    浏览(43)
  • 【Linux】进程程序替换

    👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。 执行和父进程完全不同的程序 执行和父进程完全不同的代码,

    2024年01月16日
    浏览(41)
  • 【Linux】进程的程序替换

    目标:为了让子进程帮父进程执行特定的任务 具体做法:1. 让子进程执行父进程的一部分代码 红框中的代码实际上是父进程的代码,在没有执行fork之前代码就有了,在没有创建子进程之前,父进程的代码加载到内存了,子进程被创建出来是没有独立的代码,这个代码是父进

    2024年01月17日
    浏览(46)
  • Linux :进程的程序替换

    目录 一、什么是程序替换 1.1程序替换的原理 1.2更改为多进程版本 二、各种exe接口 2.2execlp  ​编辑 2.2execv 2.3execle、execve、execvpe 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种

    2024年04月10日
    浏览(36)
  • 【Linux】—— 进程程序替换

    目录 序言 (一)替换原理 1、进程角度——见见猪跑  1️⃣ 认识 execl 函数 2、程序角度——看图理解 (二)替换函数 1、命名理解  2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve (三)自制shell 总结 在前面的文章中,我已经详细的讲解了进程

    2024年02月12日
    浏览(64)
  • Linux--进程控制(2)--进程的程序替换(夺舍)

    目录 进程的程序替换 0.相关函数 1.先看现象  2.解释原理 3.将代码改成多进程版  4.使用其它的替换函数,并且认识函数参数的含义 5.其它  关于进程替换我们需要了解的6个函数: 函数解释: 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。 如果调用出

    2024年04月29日
    浏览(39)
  • 【Linux】进程等待和替换——进程等待的原理、wait/waitpid方法、进程程序替换、进程替换原理、替换函数

    1.1进程等待的概念    进程等待指的是父进程等待子进程退出,以获取子进程的退出返回值,并释放子进程占用的资源。    当子进程先于父进程退出,但父进程没有关注子进程的退出状态时, 子进程会为了保存自己的退出状态而保持资源占用, 这种情况被称为“僵尸进

    2024年02月04日
    浏览(43)
  • Linux之进程控制&&进程终止&&进程等待&&进程的程序替换&&替换函数&&实现简易shell

    1.1 fork的使用 我们可以使用man指令来查看一下 子进程会复制父进程的PCB,之间代码共享,数据独有,拥有各自的进程虚拟地址空间。 这里就有一个代码共享,并且子进程是拷贝了父进程的PCB,虽然他们各自拥有自己的进程虚拟地址空间,数据是拷贝过来的,通过页表映射到

    2024年04月17日
    浏览(58)
  • 【Linux】进程控制 — 进程程序替换 + 实现简易shell

    上一节我们讲了进程终止和进程等待等一系列问题,并做了相应的验证,本章将继续对进程控制进行学习,我们将学习进程程序替换,进行相关验证,运用系统进程程序替换接口,自己模拟写一个shell,该shell能够实现执行指令,等一系列命令行操作…… 概念引入: 将可执行

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包