当前位置: 首页 > news >正文

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




在这里插入图片描述



首先,execexecute (意为:执行) 的缩写。



exec系列函数


各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp

  1. execll 为 list 可变参数列表

    • 原型int execl(const char *path, const char *arg, ... /* (char *)NULL */);

    • 功能:加载并执行指定的可执行文件,参数以变长参数列表的形式提供。

    • 特点:参数列表以NULL结尾。

    • 使用示例

      execl("/bin/echo", "echo", "Hello, world!", (char *)NULL);
      

  1. execlel 为 list 可变参数列表,e 为环境变量数组 envp

    • 原型int execle(const char *path, const char *arg, ... /* (char *)NULL */, char * const envp[]);

    • 功能:加载并执行指定的可执行文件,参数以变长参数列表的形式提供,并且可以指定环境变量数组。

    • 特点:参数列表以NULL结尾,同时可以指定环境变量数组。

    • 使用示例

      char *envp[] = {"HELLO=world", "USER=root", NULL};
      execle("/bin/echo", "echo", "$HELLO", (char *)NULL, envp);
      

  2. execlpl 为 list 可变参数列表,p 为 PATH

    • 原型int execlp(const char *file, const char *arg, ... /* (char *)NULL */);

    • 功能:加载并执行指定的可执行文件,参数以变长参数列表的形式提供,并在PATH环境中查找可执行文件。

    • 特点:参数列表以NULL结尾,使用PATH环境变量查找可执行文件。

    • 使用示例

      execlp("echo", "echo", "Hello, world!", (char *)NULL);
      

  1. execvv 为 vector

    • 原型int execv(const char *path, char *const argv[]);

    • 功能:加载并执行指定的可执行文件,参数以数组的形式提供。

    • 特点:参数数组以NULL结尾。

    • 使用示例

      char *args[] = {"/bin/echo", "Hello, world!", NULL};
      execv("/bin/echo", args);
      

  1. execvev 为 vector,e 为环境变量数组 envp

    • 原型int execve(const char *filename, char *const argv[], char *const envp[]);

    • 功能:加载并执行指定的可执行文件,参数以数组的形式提供,并且可以指定环境变量数组。

    • 特点:参数数组以NULL结尾,同时可以指定环境变量数组。

    • 使用示例

      char *args[] = {"/bin/echo", "Hello, world!", NULL};
      char *envp[] = {"HELLO=world", "USER=root", NULL};
      execve("/bin/echo", args, envp);
      

  1. execvpv 为 vector,p 为 PATH

    • 原型int execvp(const char *command, char *const argv[]);

    • 功能:加载并执行指定的可执行文件,参数以数组的形式提供,并在PATH环境中查找可执行文件。

    • 特点:参数数组以NULL结尾,使用PATH环境变量查找可执行文件。

    • 使用示例

      char *args[] = {"echo", "Hello, world!", NULL};
      execvp("echo", args);
      



关于 execlexecvl 和 v 的区别


execlexecv 这两个实际上没什么区别

可以看作:一个使用 list 结构传参数,一个使用 vector 结构传参数

execlp("/bin/ls", "-l", "-a", nullptr);
execv("/bin/ls", argv);  // char* argv[] = {"ls", -l", "-a", nullptr}; 



关于 execlpexecvpp 有什么用


execlpexecvp 函数的 p 表示的就是 PATH 环境变量的意思,带有 p 的这类函数不用写全路径,只需写可执行程序名即可:它们会在PATH 环境变量中查找可执行文件的位置,而不需要提供完整的路径。


例如:

execlp :该函数不要求写全路径,只需要写命令名,程序名即可(他会自己到环境变量中找,没有就报错)

execlp("ls", "ls", "-l", "-a", nullptr);

该函数写了两次 ls:内容一样,但表达的语义不同

第一个 ls:表示要执行的程序名称的字符串,即该程序的名字,用于告诉系统可以在PATH环境变量指定的目录中查找该文件

第二个 ls:作为参数列表 argv数组 的第一个元素,因为在 exec 系列函数中,程序的名字需要作为参数列表的第一个元素。





关于 execveexeclee 有什么用


e 后缀说明:该函数支持显式传递环境变量数组。


main 函数接收到环境变量表,这张表就是该进程的环境变量表

若不显式传递,即不用这两个带 e 后缀函数,则子进程默认继承父进程的环境变量表

简单来说:给子进程显式传新环境变量表,则子进程就使用新表;否则,默认从父进程继承下来“初始”表


char *args[] = {"/bin/echo", "Hello, world!", NULL};
char *envp[] = {"HELLO=world", "USER=root", NULL};execve("/bin/echo", args, envp);  // 给子进程显式传新环境变量表 envp

exec 系列函数程序替换本身不会替换修改原进程中的 环境变量,但可以通过带 e 后缀的 exec 函数显式传递新表,并修改覆盖原表



一个进程的环境变量来源

1、默认继承:子进程默认继承父进程全部环境变量表

2、显式传递:父进程显示传递全新的环境变量表(自己定义自己传递),如 execle(…, …, env),子进程就用这张新表

3、新增环境变量:进程通过 int putenv(char *env_string); ,将环境变量 char *env_string 添加进当前环境变量表中,或修改表中已存在的环境变量

putenv函数:用于修改当前进程的环境变量。

这个函数允许你在程序运行时动态地添加或更改环境变量。

  • 在 shell 进程中调用,则修改 shell 的环境变量(即我们的命令行窗口的全局环境变量表)
  • 在自己创建的进程中调用,则修改自己进程的环境变量



exec 系列函数都是库函数吗?


实际上,只有 execve 函数是真正的系统调用函数

其他的函数都是C语言库函数,内部都封装调用了 execve 函数,这几种函数只有传参方式的差别,就是为了满足不同的应用场景。

以C标准库的 execl 函数为为例,其底层的运行原理为

1、处理变长参数列表,分配内存并存储在参数列表 argv 中

2、调用 execve 函数

3、释放内存,如 argv


我们在 shell 中,通过 man 命令查询手册

在这里插入图片描述

在这里插入图片描述

相关文章:

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

首先,exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl:l 为 list 可变参数列表 原型:int execl(const char *path, cons…...

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写, 该公司1977年7月21日出版了“ARINC 429规范”一书,429规范就是飞机电子系统之间数字式数据传输的标准格式,在飞机上使用429总线的电子设备均应遵守这个规范,这样才能保证电子…...

Qt解决槽函数中发送的信号的参数会变化带来的错误

connect(item, &MusicItemWidget::playRequest, this, [this] { emit playMusic(QUrl(this->m_mediaPath); ); 如上图,this->m_mediaPath是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...

C C++ 如何编写库级接口

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

安装TDengine数据库3.3版本和TDengine数据库可视化管理工具

安装TDengine数据库3.3版本和TDengine数据库可视化管理工具 一、下载安装包二、解压安装包三、部署四、启动服务五、进入数据库六、创建数据库、表和往表中插入数据七、测试 TDengine 性能八、使用数据库九、查询数据十、TDengine数据库可视化界面 一、下载安装包 TDengine-cl…...

详解CAS

一、CAS是什么? CAS是Java中Unsafe类里面的一个方法,是Compare and Swap的缩写,中文翻译成比较并交换,主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性,实现并发算法时常用到的一种技术。它包含三…...

《环境感知方案:探索未来智能世界的关键技术》

《环境感知方案:探索未来智能世界的关键技术》 一、环境感知方案的研究现状(一)机器人领域的环境感知(二)农业领域的环境感知(三)智能网联汽车领域的环境感知 二、先进的环境感知技术&#xff0…...

Android 编译时出现Android resource linking failed.without required default value.

错误信息如下: Execution failed for task :app:processDebugResources. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction> Android resource linking failedwarn: removing r…...

golang ws升级为wss

首先需要一份openssl证书 1.安装openssl windows安装openssl 的下载地址在 https://slproweb.com/products/Win32OpenSSL.html 无脑点安装就行,记得最后安装完成的页面取消勾选 安装完成后记得配置环境变量 2.生成证书 openssl req -x509 -days 36500 -nodes …...

FFMPEG录屏(17)--- 使用 DwmRegisterThumbnail 捕获指定窗口图像数据

使用 DwmRegisterThumbnail 捕获指定窗口图像数据 在 Windows 平台上,捕获指定窗口的图像数据可以通过多种方法实现,其中一种高效的方法是使用 [DwmRegisterThumbnail] 本文将介绍如何使用 [DwmRegisterThumbnail] 捕获窗口图像数据,并提供一…...

点亮一个LED(51)

目录 1.LED介绍 2.硬件电路 3.程序设计 3.1.点亮一颗LED 3.2.LED闪烁 3.3.LED流水灯实现 1.LED介绍 发光二极管也具有二极管普遍的特性单向导电性,有阳极和阴极之分 ,上图左侧式插件式LED ,长的引脚是阳极;左侧是贴片式的带…...

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后,下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口,元素可以被分发到一个或多个窗口中,Flink 内置了常用的窗口分配器,包括:tumbling wi…...

【Tinymce】富文本编辑器在vue项目中的使用;引入付费格式刷,上传视频、图片

引言 富文本编辑器有很多,对比了一下,还是决定用tinymce(号称宇宙最强),基础的插件确实好用,但是一些更好用的插件,比如格式刷等都是高级版(付费),当然也有人…...

Java实现简单的5阶m序列密钥生成

选择5阶本原多项式:x^5 x^2 1,初始值为{1,0,0,1,1},易得,递推公式为:ak ak-5 ⊕ ak-2 ,其中k≥5。于是可以写出下面这段代码: class BitsEncode {public static void main(String[] args) {//初始化数组…...

013_django基于大数据的高血压人群分析系统2024_dcb7986h_055

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...

OpenCV高级图形用户界面(21)暂停程序执行并等待用户按键输入函数waitKey()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 等待按键 该函数 waitKey 在 delay≤0 时无限等待按键事件,或者在 delay 为正数时等待 delay 毫秒。由于操作系统在切换线程时有最小…...

其他css的用途

1.animation-fill-mode: backwards; //避免了在动画开始前元素的突然显现,动画必要。 2.用rem响应式字体大小,可以在html样式定义font-size?(例10px,62.5%(100%是16px))。然后样式就可以用rem代替px。 3.color: transparent;: 这行代码将文…...

json路径 [‘a‘].b.c[0].d[‘1‘].f,具体代表什么意思

JSON路径是一种用于从JSON对象中提取数据的表达方式。你给出的路径 [a].b.c.d[1].f 代表了如何逐层访问JSON对象中的数据。让我们逐步解析这个路径: ‌[a]‌: 表示访问JSON对象的根元素中键为 a 的值。使用方括号 [] 通常意味着这个键是一个字符串&#…...

等保测评:如何进行有效的安全合规性审查

等保测评(信息安全等级保护测评)是一项至关重要的安全合规性审查工作,旨在帮助组织保障信息系统的安全性、合规性,有效应对安全风险,提升整体安全防护水平。下面将从等保测评的流程、意义、应用场景,以及实…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发二 : 18.04ubuntu安装,linux 下build ffmpeg 4.3 源码 并测试

测试环境 ubuntu 18.04 64 位,安装vmware and ubuntu 安装后调整 分辨率: 让windows 可以和 linux 互相复制黏贴 sudo apt-get autoremove open-vm-tools sudo apt-get update sudo apt-get install open-vm-tools-desktop 一直Y reboot 依赖安装 sud…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...