Linux系统编程——exec族函数
我们来完整、系统、通俗地讲解 Linux 系统编程中非常重要的一类函数:exec
族函数(也叫 exec family)。
一、什么是 exec
?
exec
系列函数的作用是:
用一个新的程序,替换当前进程的内容。
也就是说:
-
你用
fork()
创建了一个子进程, -
然后在子进程里调用
exec()
, -
这时子进程会“变身”,从原来的程序变成你指定的新程序。
这个函数不会创建新进程,而是当前进程的替换与重启。
举个例子:
你写的程序中包含:
execl("/bin/ls", "ls", "-l", NULL);
这行代码会让当前进程(如一个子进程)变成 ls -l
命令的进程,后续你原来的代码都不执行了!
二、exec 函数族成员有哪些?
exec
系列函数一共有 6 个函数,按名字分为 3 种组合:
函数 | 路径是否自动查找? | 参数形式 | 描述 |
---|---|---|---|
execl() | 否 | 列表 | 使用绝对路径 + 参数列表 |
execv() | 否 | 数组 | 使用绝对路径 + 参数数组 |
execle() | 否 | 列表 | 和 execl() 类似,但可传环境变量 |
execve() | 否 | 数组 | 最原始的形式,底层系统调用 |
execlp() | 是 | 列表 | 像 execl() ,但会查 PATH |
execvp() | 是 | 数组 | 像 execv() ,但会查 PATH |
三、参数结构说明(重要)
int execv(const char *path, char *const argv[]);
-
path
:新程序的路径(如/bin/ls
) -
argv[]
:参数数组:-
argv[0]
:程序名(通常写成命令本身,如"ls"
) -
argv[1], argv[2], ..., NULL
:其他参数 -
最后一个必须是 NULL
,表示参数结束
-
四、分类讲解:每个函数的使用方法和例子
1. execl()
— 使用参数“列表”,不自动查找路径
原型:
int execl(const char *path, const char *arg0, ..., NULL);
示例:
execl("/bin/ls", "ls", "-l", "-a", NULL);
说明:
-
用
/bin/ls
程序替换当前进程; -
参数就像
ls -l -a
; -
最后一定要是
NULL
。
2. execv()
— 参数用“数组”,不查路径
原型:
int execv(const char *path, char *const argv[]);
示例:
char *args[] = {"ls", "-l", "-a", NULL};
execv("/bin/ls", args);
说明:
-
路径仍然是
/bin/ls
; -
参数用数组传入;
-
NULL
表示参数结束。
3. execlp()
— 参数列表 + 会查找 PATH 环境变量
原型:
int execlp(const char *file, const char *arg0, ..., NULL);
示例:
execlp("ls", "ls", "-l", NULL);
说明:
-
不用写全路径,系统会在
/bin/
/usr/bin/
等目录下找ls
; -
更加灵活,推荐!
4. execvp()
— 参数数组 + 会查 PATH(最常用!)
原型:
int execvp(const char *file, char *const argv[]);
示例:
char *args[] = {"ls", "-l", NULL};
execvp("ls", args);
说明:
-
会查找
ls
程序的位置; -
使用参数数组,适合处理用户输入;
-
实际中非常常用!
5. execle()
和 execve()
— 带自定义环境变量
-
一般情况用不到,仅当你要给新程序指定新的环境变量时才用。
五、使用 exec 的注意事项
1. exec
成功后,不会返回
因为当前进程已经“变身”为新程序,原来的代码后面就不执行了。
如果它返回了,说明执行失败了。
if (execvp("ls", args) == -1) {perror("exec failed"); // 只有失败才会执行这里
}
2. 参数列表/数组最后必须以 NULL 结尾
否则系统不知道参数在哪里结束,可能导致崩溃。
3. 建议用 execvp()
或 execlp()
因为它们会根据系统环境变量 PATH
查找程序,更灵活,用户体验更好。
4. 配合 fork()
使用
通常我们不会在主进程里直接 exec()
,而是先用 fork()
创建子进程,让子进程执行新的程序:
示例:
pid_t pid = fork();if (pid == 0) {// 子进程:执行 lsexeclp("ls", "ls", "-l", NULL);_exit(1); // exec失败才执行
} else {// 父进程:等子进程wait(NULL);
}
六、exec调用失败常见原因
原因 | 解决方法 |
---|---|
路径写错了 | 检查路径或用 execvp |
没有执行权限 | 用 chmod +x 赋权 |
参数忘记写 NULL | 确保结尾是 NULL |
系统找不到程序 | 确保程序存在于 $PATH 所列目录中 |
七、总结一句话
exec
系列函数是“把自己变成另一个程序”的魔法。
-
不创建新进程,而是“换皮重生”;
-
常用
execlp()
和execvp()
; -
一定配合
fork()
使用,否则你原来的程序会消失。
相关文章:
Linux系统编程——exec族函数
我们来完整、系统、通俗地讲解 Linux 系统编程中非常重要的一类函数:exec 族函数(也叫 exec family)。 一、什么是 exec? exec 系列函数的作用是: 用一个新的程序,替换当前进程的内容。 也就是说…...

ThinkStation图形工作站进入BIOS方法
首先视频线需要接在独立显卡上,重新开机,持续按F1,或者显示器出来lenovo的logo的时候按F1,这样就进到bios里了。联*想*坑,戴尔贵。靠。...

go 集成base64Captcha 支持多种验证码
base64Captcha 是一个基于 Go 语言开发的验证码生成库,主要用于在 Web 应用中集成验证码功能,以增强系统的安全性。以下是其主要特点和简介: base64Captcha主要功能 验证码类型丰富:支持生成多种类型的验证码,包括纯…...

【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
目录 一.字符分类函数 1.1--字符分类函数的理解 1.2--字符分类函数的使用 二.字符转换函数 2.1--字符转换函数的理解 2.2--字符转换函数的使用 三.strlen的使用和模拟实现 3.1--strlen的使用演示 3.2--strlen的返回值 3.3--strlen的模拟实现 四.strcpy的使用和模拟实现…...
deepseek问答记录:请讲解一下hugingface transformers中的AutoProcessor
Hugging Face Transformers库中的AutoProcessor是一个用于自动加载与预训练模型配套的处理器的工具类。它简化了预处理流程,特别适用于多模态模型(如同时处理文本、图像、音频的模型)。以下是详细讲解: 1. AutoProcessor的功能 •…...

大模型基础之量化
概述 量化,Quantization,机器学习和深度学习领域是一种用于降低计算复杂度、减少内存占用、加速推理的优化方法。定义:将模型中的数据从高精度表示转换为低精度表示。主要目的是为了减少模型的存储需求和计算复杂度,同时尽量减少…...

游戏引擎学习第286天:开始解耦实体行为
回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段,之前我们已经让实体的移动系统变得更加灵活,现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点,是重新审视我们处理实体类型(entity type&#x…...

win10-django项目与mysql的基本增删改查
以下都是在win10系统下,django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数:类名.objects.create(字段名值,字段名"值"。。。…...
Windows 本地部署MinerU详细教程
📖 项目概述 MinerU是一款由OpenDataLab开发的开源PDF转Markdown工具,可以高质量地提取PDF文档内容,生成结构化的Markdown格式文本。本指南将帮助您在本地部署并使用MinerU。 ⭐ 功能特性 MinerU具有以下核心功能: ✨ 文档处理…...

动态范围调整(SEF算法实现)
一、背景介绍 继续在整理对比度调整相关算法,发现一篇单帧动态范围提升的算法:Simulated Exposure Fusion,论文表现看起来很秀,这里尝试对它进行了下效果复现。 二、实现流程 1、基本原理 整体来说,大致可以分为两步…...

SpringCloud微服务开发与实战
本节内容带你认识什么是微服务的特点,微服务的拆分,会使用Nacos实现服务治理,会使用OpenFeign实现远程调用(通过黑马商城来带你了解实际开发中微服务项目) 前言:从谷歌搜索指数来看,国内从自201…...

WAS和Tomcat的对比
一、WAS和Tomcat的对比 WebSphere Application Server (WAS) 和 Apache Tomcat 是两款常用的 Java 应用服务器,但它们有许多显著的区别。在企业级应用中,它们扮演不同的角色,各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...
Rust 数据结构:String
Rust 数据结构:String Rust 数据结构:String什么是字符串?创建新字符串更新字符串将 push_str 和 push 附加到 String 对象后使用 运算符和 format! 宏 索引到字符串字符串在内存中的表示字节、标量值和字形簇 分割字符串遍历字符串的方法 R…...

IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?
检查.idea文件夹 如果项目目录中缺少.idea文件夹,可能导致项目结构无法正确加载。可以尝试删除项目根目录下的.idea文件夹,然后重新打开项目,IDEA会自动生成新的.idea文件夹和相关配置文件,从而恢复项目结构。 问题解决࿰…...

Hot100-链表-JS
160.相交链表 160. 相交链表 已解答 简单 相关标签 相关企业 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整…...

事件驱动架构:从传统服务到实时响应的IT新风潮
文章目录 事件驱动架构的本质:从请求到事件的范式转变在EDA中: 事件驱动架构的演进:从消息队列到云原生标配核心技术:事件驱动架构的基石与工具链1. 消息队列:事件传递的枢纽2. 消费者:异步处理3. 事件总线…...

网络流量分析 | NetworkMiner
介绍 NetworkMiner 是一款适用于Windows(也适用于Linux/Mac)的开源网络取证分析工具。它可被用作被动网络嗅探器/数据包捕获工具,也可被用于检测操作系统、会话、主机名、开放端口等,还能被用于解析pcap文件进行离线分析。点击此…...
弦理论的额外维度指的是什么,宇宙中有何依据
弦理论中的额外维度是解释微观世界与宏观宇宙矛盾的关键假设之一。它们并非科幻中的平行宇宙,而是通过严谨的数学框架提出,并可能留下可观测的宇宙学痕迹。以下是具体解析: 一、弦理论为何需要额外维度? 数学自洽性要求 弦理论中…...
std::tuple 用法
std::tuple 是 C11 引入的模板类,用来存储多个不同类型的值,类似于 Python 的元组。你可以把它看作是一种“组合多个变量在一个对象中”的方式。 ✅ 基本用法 #include <tuple> #include <iostream>int main() {std::tuple<int, std::st…...

深入理解 Git 分支操作的底层原理
在软件开发的世界里,Git 已经成为了版本控制的标配工具。而 Git 分支功能,更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支,但是这些操作背后的底层原理是怎样的呢?在之前的博客探秘Git底…...

Excel MCP: 自动读取、提炼、分析Excel数据并生成可视化图表和分析报告
最近,一款Excel MCP Server的开源工具火了,看起来功能很强大,咱们今天来一探究竟。 基础环境 最近两年,大家都可以看到AI的发展有多快,我国超10亿参数的大模型,在短短一年之内,已经超过了100个&…...

C语言:深入理解指针(4)
目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 五、typedef 类型重命名 六、函数指针数组 一、字符指针变量 我们常见的字符指针变量是这样的: char a w; char* p &a; char arr[] "abcd"; char* pa ar…...
Gensim 是一个专为 Python 设计的开源库
Gensim 是一个专为 Python 设计的开源库,其核心代码和生态系统均基于 Python 构建,目前官方仅支持 Python 语言。如果你需要在其他编程语言中实现类似功能(如词向量训练、主题模型等),通常需要使用对应语言的替代库或通…...
质量管理工程师面试总结
今天闲着无聊参加了学校招聘会的一家双选会企业,以下是面试的过程。 此次面试采用的是一对多的形式。(此次三个求职者,一个面试官) 面试官:开始你们每个人先做个自我介绍吧。 哈哈哈哈哈哈哈哈,其实我们…...
python 爬虫框架介绍
文章目录 前言一、Requests BeautifulSoup(基础组合)二、Scrapy(高级框架)三、PySpider(可视化爬虫)四、Selenium(浏览器自动化)五、Playwright(新一代浏览器自动化&…...
window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型
Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下,用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小,…...
蓝牙协议架构与调试工具详解(含 BLE、HCI 命令、调试命令)
本文介绍蓝牙协议从物理层到应用层的完整通信流程,并详解了 Linux 下主流蓝牙调试工具的使用方法,适用于嵌入式蓝牙驱动开发、BLE调试、通信协议分析等场景。 🔧 1. 蓝牙架构概览 ✅ 芯片架构 单模芯片:仅支持 BLE 或 Classic 蓝…...
预测模型开发与评估:基于机器学习的数据分析实践
在当今数据驱动的时代,预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验,探讨从数据清洗到模型优化的完整过程,并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…...
提高表达能力
你遇到的这种情况其实很常见,背后的原因可能涉及思维模式、心理状态和表达习惯的综合作用。以下是具体分析和解决方案: 1. 原因分析:为什么讨论时流畅,独自表达却卡壳? 外部反馈缺失:讨论时对方的提问、反…...

【更新】全国省市县-公开手机基站数据集(2006-2025.3)
手机基站是现代通信网络中的重要组成部分,它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进,手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用,本分享数据可帮助分析移动通信网络的发展和优化。本次数据…...