Linux相关概念和易错知识点(15)(exec系列函数)

linux系统编程之进程:exec系列函数使用 例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。用exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID。1,带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。它由shell进程传递给当前进程,再由当前进程传递给替换的新进程。 阅读详情

目录

1.execl

(1)如何使用

(2)工作原理

2.其它相关函数

(1)execv

(2)execlp、execvp

(3)execle、execvpe、execve


进程程序替换

我们之前已经知道如何创建子进程了。fork函数内部会为我们拷贝数据和代码,创建PCB,当走到最后return语句时两个进程分别返回,之后父子进程保持独立。虽然我们可以控制代码逻辑使得父子进程走的代码不同,父子文件始终是使用的同一个代码文件。如果我想让创建出来的子进程执行新的程序,加载新的代码呢?应当如何操作呢?

1.execl

(1)如何使用

这是语言级函数,我们可以在man手册第3页找到。当然它的底层是系统调用,不过我们介绍的是经过C语言封装了的。

形式:int  execl(const  char*  path,  const  char*  arg...)

path是要执行可执行程序的路径,要定位到具体的文件。arg是一个参数包,我们可以写任意个参数。这个参数包的作用是将里面所有的参数都交给我们要执行的可执行程序的命令行参数列表中的argv。也就是说arg要按照我们在命令行调用的写法。如execl("/usr/bin/ls", "ls", "-al", NULL),注意参数包的最后一个元素一定要是空指针。我们可以理解为参数包的内容会原封不动传给argv,显然argv的在最后一个元素就是空指针。

下面是一个使用实例。

为什么execl之后的那一句printf没有被打印呢?这就涉及到execl的工作原理了。

(2)工作原理

当我们用子进程去调用execl时,execl会顺着我们第一个参数的路径找到可执行程序,之后按照arg的内容来调用它。问题时如何在子进程里面去调用另一个可执行程序,系统不会生成新的进程来运行要调用的程序,它会直接用新的目标程序的代码和数据替换子进程的代码和数据。这中间涉及到子进程原有代码和数据的回收,硬盘导入新的代码和数据到内存中,修改页表和进程地址空间,修改一些PCB属性等操作。我们可以理解为,除了PCB这个进程的身份证没变(部分属性会按照新的可执行程序的要求改变),其它的基本上都被覆盖了。进程 = PCB + 代码和数据,只要execl成功了,那就意味着子进程的代码和数据全部被覆盖了。

execl的返回值需要我们特别关注,当execl失败时,就会返回-1,我们需要在execl后写一些处理这种错误的代码。但当execl成功时,它是没有返回值的,因为execl是对进程的代码数据进行完整地替换,当execl成功时,它自己也被覆盖了,自然不存在返回值这种说法。

execl底层也是调用相应系统接口来加载硬盘代码数据的。我们一般选择让子进程去加载,将子进程的代码数据都替换显然不会影响父进程。

Shell(bash)的原理就是如此。我们的所有程序都是在bash这个命令行界面(CLI)跑起来的。当程序启动时,bash创建一个子进程,但此时这个子进程拥有bash的代码数据,此时bash再对该进程调用execl,这样这个子进程就被替换为我们想要执行的程序,完成我们的任务了。

以上原理都必须基于进程的独立性。

2.其它相关函数

我们在man手册里还能见到其它的一些函数,它们都和execl同源,原理相同,功能和使用方式上略有区别

(1)execv

int  execv(const  char*  path,  char*  const  argv[])的第二个参数要求我们直接传指针数组,我们可以认为这个argv会被直接搬给程序的命令行参数列表argv用。v是vector,l是list,两者做好名字区分。

这里的test1就是刚才的test,我们发现argv中不需要写./test1,这是因为execv第一个参数就已经定位了可执行程序了,我们平时命令行写的./test1除了作为第一个argv参数以外还有定位文件的作用,而在这里就不需要了。

(2)execlp、execvp

int  execlp(const  char*  file,  const  char*  arg...)

int  execvp(const  char*  file,  char*  const  argv[])

这两个函数都是在execl和execv的基础上的,不需要我们输入路径,我们直接写要调用的可执行程序即可,它会自己按照环境变量PATH来查找,和指令一样。如execlp("ls", "ls", "a",  NULL),虽然第一个和第二个参数同,但含义却不同。第一个参数是告诉函数它想要执行的可执行程序,第二个是之后传入命令行参数列表argv的第一个参数。

p是path的意思。使用这两个函数要保证我们的可执行程序在PATH中。一般来说调用系统指令可以用这两个函数。

(3)execle、execvpe、execve

这些函数在原来的基础上,允许在最后一个参数自定义替换后的环境变量,而不是原来的环境变量。

如果我们就想新的程序继承原来程序的环境变量,最后一个参数可以写environ,也就是原进程环境变量全局指针。当然,不用这个函数是最直接的办法。

如果我们想要调整环境变量,可以像之前那样使用export、unset等来调整。也可以用putenv((要加的环境变量))来添加环境变量,如在exec覆盖后使用putenv( "A=B" )来添加环境变量。

注意环境变量的操作都只有对当前进程有影响。如果在修改后要创建子进程,那会继承给子进程,但它不会影响父进程以及之前创建的子进程。

其中execve是系统级函数,也就是说上面所有的exec系列函数本质都是以该函数为接口设计的,都是C标准库封装的接口

Linux进程 -- exec函数操作 exec系列函数用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。 调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。以exec开头的函数,统称exec函数:#include <unistd.h>i 阅读详情

相关推荐

Linux下execl函数的使用及编程示例

通过使用execl函数,我们可以在当前进程中执行新的程序,并传递命令行参数给它。execl函数是Linux系统中的一个系统调用函数,用于在当前进程中执行一个新的程序。"./hello"表示hello程序的路径,"hello"表示arg0参数,最后的NULL表示参数列表的结束。首先,我们需要编写hello程序的源代码。可以看到,main程序调用execl函数后,成功地启动了hello程序,并打印了欢迎信息。需要注意的是,execl函数调用后,其后的代码将不会执行,因为进程已经被替换为新的程序。

SVIPCODE的博客 504

【Linux系统】exec系列函数详细介绍

详细介绍exec系列函数的用法,每个函数的后缀 "l、e、p、v" 的意思和作用、一个进程的环境变量来源

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 2176

FPGA实战:AXI BRAM Controller写时序避坑指南(附Vivado配置步骤)

本文深入探讨了FPGA开发中AXI BRAM Controller的写时序实战要点与常见陷阱。文章聚焦于写地址与写数据通道的握手机制,详细解析了AWREADY、WVALID等关键信号的处理,并提供了Vivado中流水线深度、ECC等关键参数的配置步骤与优化建议,旨在帮助开发者有效规避时序问题,提升系统性能。

weixin_32306683的博客 170

Linux系统编程——execl函数族

● 只有失败才返回,错误值-1,所以通常我们直接在exec函数调用后直接调用perror(),和exit(),无需if判断。execlp()实现效果:子进程打印当前目录的所有文件信息,父进程打印进程id。● exec函数一旦调用成功,即执行新的程序,不返回。

weixin_67452474的博客 2509

Tushare使用教程

@Tushare简易教程 Python财经数据接口Tushare 最近在看量化分析有关的东西,然后第一步先了解的就是如何获取股票交易数据。发现大部分教程都是关于Tushare的,于是在这里简单的介绍一下Tushare的用法吧。目前tushare有免费版本和升级的需要付费的Pro版本。大多数教程写的都是免费版本,但是pro版本提供的数据更多,但是由于本人入坑还不深,暂时还是用的免费版本,但是每次使用都收到提示,“本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/documen

kuangzhi9124的博客 2万+

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 150

Linux学习笔记14 ——execl

1,原型 前面我们提到,可以用fork创建一个子进程。但是,这个子进程与原先的父进程共享程序段。也就是说两个进程执行的是同一段代码。这好像并没有太大的用处。正常来说,我们希望的不是创建的新进程可以执行完全不同的功能吗?这要怎么做呢? 这就要用到我们今天讲的exec系列函数。 通常的做法是,先用fork起一个子进程,再调用execXXX函数将子进程替换成一个指定的程序。这样狸猫换太子之后,新的...

孤独的根号3的博客 1065

ERA5数据批量下载

ERA5再分析数据的IDM接管下载

qq_38734327的博客 3034

Linux中execl函数详解与日常应用(附图解与代码实现)

exec函数族

m0_53133879的博客 3万+

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

Cadence 17.4版本导出坐标文件往往都是txt格式,并且无标题、导出时间、导出设计工程多名称等信息。那么怎么样才能导出有带这些信息的excel版本并格式好看的坐标文件呢?

一点硬件 2763

Linux下使用部分exec族函数,system函数,popen函数

可以看到的是我写的字符串常量中给出了文件地址以及参数,而且虽然system函数调用了execl函数,但是我们使用system函数给参数的时候却不需要加上NULL(因为(char *)0就相当于NULL),而且我们写的一长串字符常量是通过空格被划分成了不同的参数,程序会自动识别。下面我们用代码验正一下。运行结果如下,我们可以看到,当excel函数使用成功的时候,它就调用了echoarg文件,并且直接运行该文件的程序了,他原来的程序就不管了。并且perror函数已经告诉了我们失败的原因,是路径的错误。

杨栋的博客 2444

华为OD机试2025C卷 - 字符串解密 (C++ & Python & JAVA & JS & GO)

华为OD机试 2025C卷 字符串解密,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 976

【linux】linux进程控制(三)(进程程序替换,exec系列函数)

前言 一、单进程版——最简单的看程序替换 execl 二、谈进程替换的原理 三、多进程版——验证各种程序替换接口 execlp execv execvp execle 如何给子进程传递环境变量 putenv execle自定义环境变量传参 execvpe execve 四、拓展 进程替换shell脚本 进程替换python语言 总结

重铸自身根基的博客 1477

基于线性约束最小方差准则(LCMV)的自适应波束形成算法的matlab仿真

波束形成(BeamForming)通过对多路麦克风(常为多路全向麦)信号进行合并,抑制非目标方向信号,增强目标方向信号;进而能够实现对特定方向的聚焦拾音,能够有效提高接收信号的信噪比,也有起到降噪的作用。基本原理是波的干涉:通过调整不同阵列单元信号之间的参数,使得某些角度的信号增强,而另一些角度的信号相互抵消,例如下图中来自±45°的输入信号未被增强,而在0度方向的输入信号同相位叠加后被增强。为了将窄带波束形成扩展至宽带,可以使用频域LCMV波束形成器。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 763

android 蓝牙通讯demo

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

从理论到实践:Linux 进程替换与 exec 系列函数

Linux 进程替换通过 exec 系列函数实现,允许当前进程被新的程序替换,清空进程的用户态资源并加载新程序。该过程保留进程的内核态资源,如 PID 和文件描述符。常见的 exec 系列函数包括 execl、execp、execv 等,用于加载新程序并传递命令行参数。

A.的博客 3704

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Linux】exec 系列函数与 system

本文总结了 exec 系列函数与 system 的区别,分别介绍了每个 exec 函数的用法、特点及实际应用场景,适合入门学习或查阅参考。

weixin_56167571的博客 1337

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux下exec系列函数的使用

Linux系统中,我们可以使用可以使用system函数和exec系列的函数调用另一个可执行文件或调用命令。 exec系列函数简单介绍 #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL

年年年的博客 2839

Linux exec 系列函数:execl execv等

exec 系列函数:execl execv等1. exec函数族1.1 exec 重要说明!!!1.2 使用exec函数族主要有两种情况:2.1 exec 函数族6个函数可以划分为两组:2.2 exec 函数的原型如下:2.3 exec 命名规律2.3.1 exec函数里的参数可以分成3个部分2.3.2 好了说下命名规则:2.4 参数说明:2.5 exec 返回值4. 6个函数接口的代码示例4.1 execl 代码示例4.1.1 execl 执行成功不返回/命令执行失败返回-14.1.2 execl + f

哈尼的博客 5590

linux代码实操:exec系列函数进程实验

, 接着调用exec系列函数(实验中使用execl()函数), 这个函数在/bin/ls目录中搜索程序ls,然后它将会替换exec_demo本身的进程, 程序运行结果与在终端中使用以下所示的shell命令一样,如下图。前面我有一篇文章介绍到了使用fork()函数启动一个子进程,事实上,这是并没有太大作用的,因为子进程跟父进程都是一样的, 子进程能干的活父进程也一样能干,因此世界各地的开发者就想方设法让子进程做不一样的事情, 于是诞生了。, 在执行完之后,原调用进程的内容除了进程号外,其他全部。

weixin_64685646的博客 2263

Linux函数exec

Linux函数exec 一、概述: 当用fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当程序调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。 三、有7种不同的exec函数可供使用,它们常常被统称为exec函数。 #include <unistd.h> e

qq_52551323的博客 4324

【Linux】exec函数族及进程控制相关

linux进程管理——exec函数族简单介绍及进程控制(j进程退出、孤儿进程、僵尸进程)及进程退出信息相关宏函数

sinat_41752325的博客 1767

Linux Fork和exec系列函数

原文发在github.io博客上。 转载写明出处http://landerlyoung.github.io/blog/2014/01/13/linux-forkhe-execxi-lie-han-shu/ linux 中的fork和exec函数是进程相关的两个函数,最早在大二的操作系统课上了解到。今天要写个小东西偶尔用到就研究了一下。 1.fork fork的功能是创建一个

LanderlYoung 1529

《Linux系统编程篇》exec族函数——基础篇

当我们介绍完fork之后,你会发现虽然我可以同时跑俩个程序,但是还是太过于局限了,而且细心的学员们发现,进程直接是完全不互通的,好像fork之后什么也做不了,是的,只学完`fork`就是这样的,所以我们再来介绍新的知识。`exec`族函数。

Strange_Head的博客 1397

linux系统编程之进程(三):exec系列函数和system函数

一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。 二、exec关联函数组 包含头文件 功能用exec函数可以把当前进程替换为一个新进程。exec

Meditation 5959

Linux下进程替换exec系列接口

Linux下exec系列接口

shiyue 1484
上一篇: Linux相关概念和易错知识点(14)(进程终止、进程退出、退出信息)
下一篇: Linux相关概念和易错知识点(16)(Shell原理、进程属性和环境变量表的联系)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值