exec函数

Python exec函数 exec()# 执行简单的函数定义greet("Alice") # 输出:Hello, Alice在这个示例中,使用exec()函数执行了一个简单的函数定义,定义了一个名为greet的函数,然后在之后的代码中调用了这个函数。通过本文,已经了解了exec()函数的基本用法、安全性考虑、实际应用场景,并掌握了如何在实际编程中使用它。exec()函数是Python中一个非常强大但也容易被误用的函数,它可以用于执行存储在字符串或代码对象中的Python代码,并且可以修改当前的全局和局部命名空间。 阅读详情
 

(1)exec函数说明

fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。

 

(2)在Linux中使用exec函数族主要有以下两种情况

当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。

如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。

 

(3)exec函数族语法

实际上,在Linux中并没有exec函数,而是有6个以exec开头的函数族,下表列举了exec函数族的6个成员函数的语法。

所需头文件

#include <unistd.h>

函数说明

执行文件

函数原型

int execl(const char *path, const char *arg, ...)

int execv(const char *path, char *const argv[])

int execle(const char *path, const char *arg, ..., char *const envp[])

int execve(const char *path, char *const argv[], char *const envp[])

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

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

函数返回值

成功:函数不会返回

出错:返回-1,失败原因记录在error中

这6 个函数在函数名和使用语法的规则上都有细微的区别,下面就可执行文件查找方式、参数表传递方式及环境变量这几个方面进行比较说明。

①    查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径,而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。

②    参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举的方式,而另一种则是将所有参数整体构造成指针数组进行传递。

在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它,数组中的最后一个指针要求是NULL。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。

③    环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量。

 

(3)PATH环境变量说明

PATH环境变量包含了一张目录表,系统通过PATH环境变量定义的路径搜索执行码,PATH环境变量定义时目录之间需用用“:”分隔,以“.”号表示结束。PATH环境变量定义在用户的.profile或.bash_profile中,下面是PATH环境变量定义的样例,此PATH变量指定在“/bin”、“/usr/bin”和当前目录三个目录进行搜索执行码。

PATH=/bin:/usr/bin:.

export $PATH

 

(4)进程中的环境变量说明

    在Linux中,Shell进程是所有执行码的父进程。当一个执行码执行时,Shell进程会fork子进程然后调用exec函数去执行执行码。Shell进程堆栈中存放着该用户下的所有环境变量,使用execl、execv、execlp、execvp函数使执行码重生时,Shell进程会将所有环境变量复制给生成的新进程;而使用execle、execve时新进程不继承任何Shell进程的环境变量,而由envp[]数组自行设置环境变量。

 

(5)exec函数族关系

第4位

统一为:exec

第5位

l:参数传递为逐个列举方式

execl、execle、execlp

v:参数传递为构造指针数组方式

execv、execve、execvp

第6位

e:可传递新进程环境变量

execle、execve

p:可执行文件查找方式为文件名

execlp、execvp

      事实上,这6个函数中真正的系统调用只有execve,其他5个都是库函数,它们最终都会调用execve这个系统调用,调用关系如下图12-11所示:

                

                                        图12-11 exec函数族关系图

 

(6)exec调用举例如下

char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};

char *const ps_envp[] ={"PATH=/bin:/usr/bin", "TERM=console", NULL};

execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execv("/bin/ps", ps_argv);

execle("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);

execve("/bin/ps", ps_argv, ps_envp);

execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execvp("ps", ps_argv);

请注意exec函数族形参展开时的前两个参数,第一个参数是带路径的执行码(execlp、execvp函数第一个参数是无路径的,系统会根据PATH自动查找然后合成带路径的执行码),第二个是不带路径的执行码,执行码可以是二进制执行码和Shell脚本。

 

(7)exec函数族使用注意点

在使用exec函数族时,一定要加上错误判断语句。因为exec很容易执行失败,其中最常见的原因有:

①    找不到文件或路径,此时errno被设置为ENOENT。

②    数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT。

③    没有对应可执行文件的运行权限,此时errno被设置为EACCES。

 

(8)exec后新进程保持原进程以下特征

Ÿ      环境变量(使用了execle、execve函数则不继承环境变量);

Ÿ      进程ID和父进程ID;

Ÿ      实际用户ID和实际组ID;

Ÿ      附加组ID;

Ÿ      进程组ID;

Ÿ      会话ID;

Ÿ      控制终端;

Ÿ      当前工作目录;

Ÿ      根目录;

Ÿ      文件权限屏蔽字;

Ÿ      文件锁;

Ÿ      进程信号屏蔽;

Ÿ      未决信号;

Ÿ      资源限制;

Ÿ      tms_utime、tms_stime、tms_cutime以及tms_ustime值。

对打开文件的处理与每个描述符的exec关闭标志值有关,进程中每个文件描述符有一个exec关闭标志(FD_CLOEXEC),若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。除非特地用fcntl设置了该标志,否则系统的默认操作是在exec后仍保持这种描述符打开,利用这一点可以实现I/O重定向。

 

(9)execlp函数举例

execlp.c源代码如下:

#include <stdio.h>

#include <unistd.h>

int main()

{

    if(fork()==0){

        if(execlp("/usr/bin/env","env",NULL)<0)

        {

            perror("execlp error!");

            return -1 ;

        }

    }

    return 0 ;

}

编译 gcc execlp.c –o execlp。

执行 ./execlp,执行结果如下:

HOME=/home/test

DB2DB=test

SHELL=/bin/bash

       ……

由执行结果看出,execlp函数使执行码重生时继承了Shell进程的所有环境变量,其他三个不以e结尾的函数同理。

 

(10)execle函数举例

利用函数execle,将环境变量添加到新建的子进程中去。

execle.c源代码如下:

#include <unistd.h>

#include <stdio.h>

int main()

{

    /*命令参数列表,必须以 NULL 结尾*/

    char *envp[]={"PATH=/tmp","USER=sun",NULL};

    if(fork()==0){

        /*调用 execle 函数,注意这里也要指出 env 的完整路径*/

        if(execle("/usr/bin/env","env",NULL,envp)<0)

        {

            perror("execle error!");

            return -1 ;

        }

    }

    return 0 ;

}

编译:gcc execle.c –o execle。

执行./execle,执行结果如下:

PATH=/tmp

USER=sun

可见,使用execle和execve可以自己向执行进程传递环境变量,但不会继承Shell进程的环境变量,而其他四个exec函数则继承Shell进程的所有环境变量。

             

                摘录自《深入浅出Linux工具与编程》

system函数与exec函数 文章目录system函数与exec函数system函数exec系列函数 system函数与exec函数 启动另一个新的进程 system函数   &gt;&gt; system函数的原型: #include &lt;stdlib.h&gt; int system(const char *string);   &gt;&gt; system函数的作用:   运行一条命令并等待该命令的完成,该... 阅读详情

相关推荐

在 Shell 脚本中使用 `exec` 命令的方法和用途

exec是一个用于替换进程或执行命令的 Shell 内建命令。它可以将当前脚本的执行环境替换为新的进程,并在执行新进程后不返回到原始脚本。简单来说,exec命令用于取代当前进程并执行新的命令。使用exec命令可以实现以下功能:执行一个新的命令并替换当前进程。将当前脚本的执行环境传递给新的进程。在脚本中启动后台进程并将控制权转移到后台进程。exec命令是一个在 Shell 脚本中非常有用的工具,可以用于执行新的命令、传递执行环境给新进程以及启动后台进程。使用exec。

网络技术联盟站 9201

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

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

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

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

exec函数详解

(1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。 (2)在Linux中使用exec函数族主要有以下两种情况 当进程认

modi000的博客 2万+

分辨率太小 / Retina 模糊 / 全屏异常:一篇解决 VMware Fusion + Kali 显示问题(Xfce & GNOME 通用)

本文提供了在Mac(尤其是Retina屏)上运行Kali Linux时常见显示问题的完整解决方案。主要解决三类问题:分辨率太小、Retina屏模糊和全屏异常。核心思路是先安装open-vm-tools-desktop并重启,这是90%问题的根源。然后根据不同问题分别处理:调整DPI/Scale解决字体大小,避免双重缩放导致的模糊,以及通过窗口拉伸和重启解决全屏异常。文章还给出了针对Xfce和GNOME的最佳配置建议,并强调调试完成后应创建快照以便快速恢复。最后提供了速查表,方便用户快速参考关键步骤。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 874

【Ensp】FTP服务器设置和FTP解析

大部分的多媒体多媒体应用协议,如SIP,FTP,NetMeeting协议等,使用约定的固定端口来初始化一个控制连接,再动态地选择端口用于数据传输,并且这些端口选择是不可预测的。在防火墙设置时,可以通过ASPF(应用层报文过滤)中的Server Map表来满足多通道协议的正常工作,它正常检测应用层报文信息,并动态地根据报文内容创建和删除临时的Server Map表项,以允许其它非约定端口通过防火墙。(5)我们可以在路由器或能访问ftp服务器的设备上,通过cli命令行的方式来访问ftp服务器。

进击的小小白 1862

shell exec命令(exec指令)(实现进程替换)

exec 是一个 Shell 内置命令,它的作用是将当前进程替换为指定的命令或程序。具体来说,exec 命令会将指定的命令或程序加载到当前进程的内存空间中,并将当前进程的 PID(进程 ID)保持不变,同时替换当前进程的代码、数据和堆栈等信息,从而实现进程的替换。实现进程的替换:使用 exec 命令可以实现进程的替换,从而在不创建新进程的情况下更新进程的代码和数据。优化进程性能:使用 exec 命令可以减少进程间的通信和数据拷贝,从而提高进程的性能。在脚本中看到exec命令,不知道干什么用的。

Dontla的博客 1万+

embedding计算过程

文章目录embedding计算过程(错了跟我讲,我会改)参考示例个人理解过程图示总结(基于pytorch) embedding计算过程(错了跟我讲,我会改) 参考示例 https://www.jianshu.com/p/63e7acc5e890 个人理解过程图示 总结(基于pytorch) 总的来说,就是将独热向量的长度(对应嵌入层的num_embeddings)转变为嵌入层的emdedding_size(而独热向量的维数就是你的数据中一共产生了多少个不一样的词,至少是这么多)。 数据的变化,将二维

纸上得来终觉浅,绝知此事要躬行! 1631

exec函数 终极总结

进程控制之exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。 有6种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数使得UNIX进程控制原语更加完善。用fork可以创建新进程,用exec可以执行新程序。e.

weixin_38606457的博客 4284

一次点击跑通:用 Postman 自动获取并携带 CSRF token,测试 SAP OData 写操作

SAP OData 写操作自动化测试方案 针对 SAP Gateway OData 服务写操作中常见的 CSRF token 验证问题,本文提出了一套基于 Postman 的自动化解决方案: 问题分析:解释了 CSRF token 的验证机制及其必要性,说明手工测试效率低下的原因 解决方案: 使用 Postman 环境变量存储 token 通过脚本自动获取并传递 token 利用 Collection Runner 实现一键执行 实施步骤: 创建环境变量存储 token 第一个请求获取 token 并存入变

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

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 565

Linux函数exec

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

qq_52551323的博客 4324

华为OD机试真题2025双机位C卷 C++ 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 280

python exec 函数_Python之浅谈exec函数

在Python中,exec()是一个十分有趣且使用的内置函数,不同于eval()函数只能执行计算数学表达式的结果的功能,exec()能够动态地执行复杂的Python代码,能够十分强大。具体的介绍可以参考官方文档: https://docs.python.org/3/library/functions.html#exec 。本次分享讲简单聊聊exec()函数的用法,希望能给读者一点启示和参考。首先是...

weixin_35174422的博客 2244

全新YOLOv11一文弄懂 | YOLOv11网络结构解读 、yolov11.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

本文全面介绍了YOLOv11目标检测算法,包含网络结构解析、yaml配置文件详解及训练教程。YOLOv11通过改进的C3k2f模块、SPPF和C2PSA注意力机制等创新设计,在COCO数据集上实现了比YOLOv8更优的性能。文章详细解读了yolov11.yaml配置文件的参数设置、主干网络(backbone)和头部网络(head)结构,并提供了完整的训练代码示例和参数说明。训练部分涵盖了模型选择、参数设置及优化技巧,包括epochs、batch size、学习率等关键参数的调整建议。最后总结了YOLOv11

Ai缝合怪、助力小伙伴高效发论文 3万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

linux的exec族函数,exec函数族

本文将为您描述exec函数族,教程操作方法:exec函数族fork()函数创建子进程后,子进程往往要调用一种e x e c函数以执行另一个程序。当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其 ma i n函数开始执行。 因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。 有六种不同的e x e c函数可...

weixin_39859394的博客 165

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

exec()函数

exec()系列函数是非常强大且常用的系统调用,它们允许一个进程用新的程序替换自己,从而执行不同的任务。常见的使用场景包括执行命令、创建新的进程来执行任务等。通过合理的使用exec(),可以有效地实现多任务处理,尤其是在 shell 和进程管理中。

2503_90266635的博客 1509

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

exec函数用法总结

1. exec函数说明 fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程由了独立的地址空间。),也就是这两个进程做完全相同的事。 在fork后的子进程中使用exec

zjwson的博客 7万+

python中exec函数_python exec函数怎么用?

我们在写编程的过程中,会发现,代码会越来越复杂。为了能出现自己想要的内容,程序越写越长,越写越复杂,也越来越难让自己看懂。其实呀,这是不可避免的。但是在python中,有帮助我们执行复杂的python代码,功能十分强大,那就是exec()函数,今天我们就来聊聊exec()函数。1、exec 语法exec(object[, globals[, locals]])2、参数object:必选参数,表示需...

weixin_39683176的博客 3431

函数exec

fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec的函数时,该进程执行的程序完全替换为新的程序(就是通过子进程取执行其他程序,此时子进程ID不变,exec只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段),新程序执行完毕之后exec不会回到原程序继续执行。 exec有7个函数供我们使用,他们能实现的功能相同,只是方式不太一样,称为exec族函数。 int execl(const char *path, const char

weixin_48006170的博客 1092

exec函数族

exec函数族 在进程中运行新的代码 当进程调用一种exec函数时,该进程执行的程序完全替代为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后进程ID并未改变。exec只是用磁盘上的一个程序替换了当前进程的正文段、数据段、堆段和栈段 exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何linux下可执行的脚本文件 内核也是使用exec来启动一个程序

weixin_43937576的博客 417

python exec函数_Python之浅谈exec()函数

在Python中,exec()是一个十分有趣且使用的内置函数,不同于eval()函数只能执行计算数学表达式的结果的功能,exec()能够动态地执行复杂的Python代码,能够十分强大。具体的介绍可以参考官方文档: https://docs.python.org/3/library/functions.html#exec 。本次分享讲简单聊聊exec()函数的用法,希望能给读者一点启示和参考。首先是...

weixin_39517357的博客 701
上一篇: fork系统调用
下一篇: wait和waitpid函数
guoping16
博客等级 码龄19年 283粉丝 47原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值