进程程序替换

【Linux】进程程序替换 学习进程替换的原理,掌握一些exec*函数的用法。 阅读详情
引入进程程序替换的概念

一般在fork了一个子进程之后,子进程往往会调用exec函数组来执行其他的程序,因为我们的子进程不可能直接执行很多的功能,这个大家在以后的操作中会慢慢的体会到

程序替换的几个特点
  • 进程在使用exec函数族进程进程替换的时候,并没有创建一个新的进程,所以当前进程的进程ID并没有改变。exec函数族只是用磁盘上面的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。
  • 调用exec函数族后,除非调用失败,否则没有返回值,并且调用失败之后,调用处之后的子进程的程序继续执行,如果调用成功,调用处之后的子进程将不再执行。
  • 当子进程调用exec函数族之后,不管成功与否,父进程依然可以正常执行的。
    下面我们想写一些程序来测试上面的例子
#include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6     pid_t son = fork();
  7     if(son == 0)  //子进程
  8     {
  9         printf("i am son. my id is %d\n",getpid());
 10         execl("/bin/ls","ls","-a","-n","-l",NULL);
 11         printf("调用exec函数失败\n");
 12         exit(0);
 13     }
 14     else //父进程
 15     {
 16         printf("i am father\n");
 17         sleep(5);
 18     }
 19 
 20     return 0;
 21 }

这里的结果如下图所示

这里写图片描述
我们来根据上面的结果来分析一下,这里执行完我们的替换函数之后,就没有执行printf(“执行完毕exec函数\n”);说明 我们上文中的第二个结论中“如果调用成功,调用处之后的子进程将不再执行”是正确的。
接下来我们把程序改一下,测试一下如果调用失败是一个什么样的结果
我们这里只把exec函数中的”/bin/ls”改成”/bin/lsss”这样它在bin目录下肯定是找不到了,所以程序应该是调用失败的,失败了之后显示的结果是下图

这里写图片描述
这说明当我们exec函数失败后,调用的进程没有被替换,所以后面的程序继续执行
然后我们还需要看一下父进程的 结果是什么样的,从 上面的结果看不管子子进程调用exec函数结果如何,父进程始终正常运行。
接下来我们试了一下vfork的结果是什么样的,测试之后的结果还是什么上面的结论,当子进程调用exec函数族之后,不管成功与否,父进程依然可以正常执行的。
大家可以下去尝试一下vfork,vfork的作用 是保证子进程先执行。

简析exec函数族

首先看一下exec函数族的定义

#include <unistd.h>
 2 extern char **environ;
 3 int execl(const char *path,
              const char *arg, ...);
 5 int execlp(const char *file, 
 6            const char *arg, ...);
 7 int execle(const char *path,
 8            const char *arg,
 9            ..., 
10            char * const envp[]);
11 int execv(const char *path,
12           char *const argv[]);
13 int execvp(const char *file, 
14            char *const argv[]);
15 int execve(const char *file,
16             char *const argv[],
17             char *const envp[]);

浅析进程替换函数
进程替换函数有六种分别是execl、execlp、execle和execv、execvp、execve,我们首先观察这几个函数会发现这些函数都是以exec开头的,由此我们称这些函数是exec函数族。
接下来又分为两类,一类是execl,一类是execv。前面三个是以execl开头,这个开头有一个特点就是在exec后面加上了l,我们发挥想象 可以想象到STL中的list,就是一个链表,这里可以理解为我们在使用这中类型的函数的时候是需要传入的一个可变的参数列表的。
这个可变参数列表实际上就是一些程序的一些可执行选项,比如我们在执行ls命令的时候,实际上就是在shell程序下进行了一次程序替换,在执行ls的时候我们可以给他它加上许多选项,比如ls -a -l等等。
另外就是execv,这个v可以让我们想起STL中的vector,就是线性表,就是我们在使用这个函数的时候需要传入的是一个数组。

再来解释一下带有p的函数,表示不需要加入替换程序的绝对路径或者是相对路径,不带p的就是要加入绝对路径或者是相对路径,另外还有就是带有e的函数,这个时候我们可以传入特定的环境变量。

接下来举例子来具体看看这些函数是如何使用,比如我们在父进程中创建了一个子进程,然后又在这个子进程中的合适位置调用了exec函数,那么这个时候就会发生程序替换

execl
execl("/bin/ls","ls","-a","-l","-n",NULL)

这里因为是一个execl函数,他没有带有p,所以我们第一个参数传递的是替换程序的绝对路径或者是相对路径,这里我门替换的函数是ls函数,它的绝对路径是”/bin/ls”,下面的那些事执行这个程序的一些选项,注意要以NULL结尾

execlp
execlp("ls","ls","-a","-l","-n",NULL)

加上这个p之后我们就不需要加上程序的路径了,execlp会自己搜索,这个时候有人就会问了,为什么还要写两次ls呢,这里第一个ls是我们需要执行的程序,第二个ls结合着后面的一些选项就是我们是要如何执行。

execv
char* _agrv[] = {"ls","-a","-n","-l",NULL};
execv("/bin/ls",_agrv);

其实这里很简单,我们无非就是把上面的那个函数的后面的选项加入到一个指针数组里面去了,这个就是execv函数组的意义,其他的两个函数这里就不解释了。

execle

这个函数我们需要传入特定的环境变量,这个留个悬念,大家自己网上搜索吧。
补充说明,上面替换的程序可以是大家自己写的程序哦…

Geant4 案例分析(一): B1 本文是对Geant4 B1的案例分析,其中特定的功能不做介绍,而注重于各个文件的主要功能,以及它们组织的方式。 阅读详情

相关推荐

【小宁学习日记6 PCB】电路原理图

本文系统讲解了电子硬件设计中原理图的阅读与绘制技巧。首先剖析原理图的四大核心要素(元件符号、连接线、结点、注释),强调注释对可读性的重要性。然后提出三步读懂法:查看图纸信息、分模块分析、结合芯片手册验证,并列举5个典型芯片案例(CH224K、CH343P等)进行实战解析。最后给出6条绘制规范:模块化布局、详细标注、规范命名、信号流布局、符号封装匹配、版本管理。文章指出原理图是电子设计的"地基",掌握规范阅读与绘制方法能大幅提升设计效率,避免常见错误。新手应从开源项目分析和简单电路绘制入手

qq_74376834的博客 2355

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

[Linux]进程替换原理, exec系列系统调用, 用C程序执行其他语言程序, 模拟实现简单的shell(命令行解释器)

Hello_World_213的博客 1692

2011-2024年间各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2、指标:数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。中国各省的数字普惠金融指数数据,从数字金融覆盖广度、数字金融使用深度和普惠金融数字化程度3个维度来构建数字普惠金融指标体系。数字普惠金融指数一共3个维度、33项具体指标。全套指数包含数字金融覆盖广度指数、数字金融使用深度指数和普惠金融数字化程度指数,以及数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数。

【优快云】 1万+

详解:进程程序替换

一般情况下,对应的语言写的程序只能调用对应的语言的接口,而不能调用其他语言的接口,如C++不能调用Java或者Python或者Shell等语言的接口,那么如果我们想要调用别人写的程序应该怎么办呢?那么进程程序替换就能够很好地帮助我们解决这个问题,这在很大程度上减少了我们编程的成本,学会进程程序替换,在很多时候,如果有现成的程序,那么我们不需要自己再去写一个,是不是方便很多了?

胡坚涛的博客 1510

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

【华为OD机试真题】65、高矮个子排队 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >现在有一队小朋友,他们高矮不同,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。 >  我们现在希望小朋友排队,以"高" "矮" "高" "矮" 顺序排列,每一个高位置的小朋友要比相邻的位置高或者相等;每个 "矮" 位置的小朋友要比相邻的位置矮或者相等; >  要求小朋友们移动的距离和最小,第一个从“高"位开始排,输出最小移动距离即可。 >  例如,在示范小队{5,3,1,2,3}中, {5, 1, 3, 2, 3}是排序结果。 > 

KJ.JK 2102

进程替换详解

e代表环境变量,程序替换不会替换环境变量,我们可以通过带e的接口设置新的环境变量。我们可以创建子进程,然后把子进程替换成我们需要的进程,执行其他程序的代码。并且我们代码中的 exec end 没有打出来,验证了进程替换后,后续代码不再执行。进程替换后:1、程序替换后,替换函数之后的代码不会被执行,因为进程已经被替换了。3、替换完成,不创建新的程序。我们可以观察得到,这些函数前面都有exec,后面跟着的。进程替换就是把当前进程替换成我们需要执行的进程,一般是通过系统调用实现。4、程序替换不会替换环境变量。

m0_74626010的博客 375

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

随着新零售和智能仓储的快速发展,商品识别技术成为计算机视觉领域的重要研究方向。本文详细介绍了基于YOLO系列算法的商品识别系统的完整实现方案,涵盖算法原理、数据集构建、模型训练、系统集成和可视化界面开发。通过对比YOLOv5到YOLOv8各版本性能差异,我们构建了一个高效、准确且用户友好的商品识别系统,并提供完整的代码实现。

YOLO 286

linux--进程程序替换

所谓进程程序替换,顾名思义,就是使用一个新的程序替换原有的程序,进程将执行新程序的代码,而不再执行原有程序的代码,前面我们已经学习了如何创建一个进程,一般情况下,进程程序替换都不会使用父进程直接进行进程程序替换,而是让父进程调用fork()函数创建一个子进程,让子进程去执行一个新的程序即可。

qzt__l0ve的博客 1242

acados安装与调试指南:版本兼容性问题

在计算机编程领域,软件工具和库的安装与调试是每个开发者必经的挑战。最近,在安装和使用acados库时,我遇到了一个有趣的问题,这里我将详细分享我的经验和解决方案。

m0_62153576的博客 740

RAG系统中Embedding模型选型实战

本文详细介绍了RAG系统中Embedding模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Embedding模型API

herosunly的博客 17万+

【Linux】进程的程序替换

编写极简版本的shell(bash)目标:为了深刻的理解shell的运行原理输入,发现bash就是一个进程由于shell是一个进程,所以用while死循环。

qq_62939852的博客 2649

【论文复现】——基于NDT与ICP结合的点云配准算法(matlab版)

基于NDT与ICP结合的点云配准算法matlab版

点云侠的博客 490

八、进程程序替换

说到环境变量之前我们先来看一下这个问题,我们刚刚提到过,进程替换可以让我们执行其他语言写的程序,那么我们怎么来执行呢?命令行怎么写(ls -l -a), 这个参数就怎么填"ls",“-l”,“-a”,最后必须是NULL,标识参数传递完毕[如何执行程序的]带e的都是可以传环境变量的(execle,execvpe)但是会覆盖系统原有的环境变量,把自己传的环境变量交给进程;子进程执行的是父进程的代码片段,如果我们想让创建出来的子进程,执行全新的程序呢?因为进程一旦替换成功,是将当前进程的代码和数据全部替换了!

weixin_54447296的博客 843

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Linux进程】进程程序替换

父进程创建子进程去执行任务,执行的代码和数据,其实都是父进程的一部分,如果我们想让子进程执行全新的代码和数据,不再和父进程有任何关系怎么办?——进程程序替换,本文我们就来聊一聊进程程序替换;

2202_75605090的博客 1031

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Linux】—— 进程程序替换

详解进程的程序替换

m0_56069910的博客 1050

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[Linux] Linux 进程程序替换

在之前,我们已经学习了什么是进程的创建,退出,等待,以及有关进程地址空间的问题。接下来的进程程序替换依然是属于进程控制的范畴,但是在实际应用中,是非常重要的一种技术。本文不直接像书本上一样,一开始就说一大堆概念,让人摸不清头脑,而是现观察进程程序替换的现象,然后再从现象中在进一步了解进程程序替换。进程程序替换有一些专门(对口)的函数,我们可以通过man手册查到其中的一个函数:int main()return 0;

石墨博客 1880

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

子进程在被创建后,共享的是父进程的代码,如果想实现自己的逻辑就需要再额外编写代码,为了能让子进程执行其他任务,可以把当前子进程的程序替换为目标程序,此时需要用到Linux进程程序替换相关知识

北 海的博客 5081

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

所谓进程程序替换,顾名思义,就是使用一个新的程序替换原有的程序,进程将执行新程序的代码,而不再执行原有程序的代码,前面我们已经学习了如何创建一个进程,一般情况下,进程程序替换都不会使用父进程直接进行进程程序替换,而是让父进程调用fork()函数创建一个子进程,让子进程去执行一个新的程序即可进程程序替换是指在运行过程中将一个进程的地址空间中的代码、数据和堆栈等内容完全替换为另一个程序的代码、数据和堆栈的过程。有人就说了上面那些函数,我怎么记得住他们的用法啊?

2301_80224556的博客 1873

Linux【进程程序替换】

在Linux系统中,程序替换是一种让子进程执行特定任务的技术。子进程在被创建后,共享父进程的代码,但通过程序替换,子进程可以执行其他程序。程序替换的主要目的是让子进程执行特定的指令,如shell中的bash通过创建子进程并替换为对应的指令程序来执行任务。Linux提供了七大替换函数,包括execl、execv、execlp、execvp、execle、execve和execvpe,这些函数都属于exec替换家族。其中,execve是系统级接口,其他函数都是基于它的封装。这些函数在程序替换失败时返回-1,成功

2401_83603768的博客 1256
上一篇: 进程等待
下一篇: 进程间通信--命名管道
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值