news 2026/5/1 5:03:42

嵌入式第三十五篇——linux系统编程——exec族函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式第三十五篇——linux系统编程——exec族函数

一、exec 族函数

1. 核心功能

exec 族函数的核心作用是替换当前进程的代码段、数据段和堆栈段,执行系统上的任意一个可执行文件(二进制程序或脚本)。执行后,原进程的代码会被新程序完全替换,新程序从main函数开始执行;若 exec 函数执行成功,原进程后续的代码不会再执行,只有新程序执行结束,整个进程才会终止。

通常 exec 族函数会与fork()搭配使用:父进程通过 fork 创建子进程,子进程调用 exec 执行新程序,父进程则负责等待子进程结束(如使用wait()/waitpid()),这样既保留了父进程,又能让子进程执行新任务。

2. 命名规则与参数含义

exec 族函数的命名后缀(l/v/p)有明确含义,是理解其用法的关键:

  • l(list):参数以可变参数列表的形式逐个传入,最后以NULL作为结束标志。
  • v(vector):参数存储在字符串数组中,数组最后一个元素必须是NULL
  • p(PATH):只需传入可执行文件的文件名,函数会自动在系统环境变量PATH指定的路径中查找该文件;若无p后缀,则需要传入完整路径 + 文件名

3. 常用 exec 函数原型与说明

(1)execl
#include <unistd.h> int execl(const char *path, const char *arg, ...);
  • 参数
    • path:待执行程序的完整路径 + 文件名(如/bin/ls)。
    • arg:新程序的参数列表,第一个参数通常是程序名本身,后续为具体参数,最后以NULL结束。
  • 返回值:执行成功则无返回(原进程已被替换),执行失败返回-1(并设置errno)。
(2)execlp
#include <unistd.h> int execlp(const char *file, const char *arg, ...);
  • 参数
    • file:待执行程序的文件名(如ls),函数会在PATH环境变量中查找该文件。
    • arg:参数列表,规则同execl,以NULL结束。
  • 返回值:成功无返回,失败返回-1
(3)execv
#include <unistd.h> int execv(const char *path, char *const argv[]);
  • 参数
    • path:待执行程序的完整路径 + 文件名
    • argv:存储参数的字符串数组,数组第一个元素为程序名,最后一个元素为NULL
  • 返回值:成功无返回,失败返回-1
(4)execvp
#include <unistd.h> int execvp(const char *file, char *const argv[]);
  • 参数
    • file:待执行程序的文件名,依赖PATH环境变量查找。
    • argv:参数数组,规则同execv,最后以NULL结束。
  • 返回值:成功无返回,失败返回-1

4. 通用规则

若需要调用自定义的可执行程序,无论使用上述哪个 exec 函数,只要将第一个参数(path/file)填写为完整路径 + 文件名,都可以成功调用(无需依赖PATH环境变量)。

二、system 函数

system函数用于执行一个 shell 命令,其内部实现依赖fork()+exec()+waitpid():先创建子进程,子进程调用 exec 执行 shell 命令,父进程等待子进程结束。

注意:system执行的 shell 命令不能是修改父进程状态的命令(如cd,因为子进程的环境修改不会影响父进程),通常用于执行信息输出(如ls)、文件操作(如rm/cp)等无状态修改的命令。

#include <stdlib.h> int system(const char *command);
  • 参数command:需要执行的 shell 命令字符串(如"ls -l""rm test.txt")。
  • 返回值
    • fork()失败或waitpid()出错,返回-1
    • exec()失败(如命令不存在),返回值对应 shell 执行失败的状态;
    • 若执行成功,返回命令的退出状态。

三、路径操作函数(getcwd/chdir)

1. getcwd:获取当前工作路径

#include <unistd.h> char *getcwd(char *buf, size_t size);
  • 功能:获取当前进程的工作目录(即当前所在路径),并存储到指定的字符数组中。
  • 参数
    • buf:用于存储路径的字符数组。
    • size:字符数组buf的最大长度(需足够容纳路径字符串 + 结束符\0)。
  • 返回值
    • 成功:返回指向buf的指针;
    • 失败:返回NULL(并设置errno,如buf空间不足)。

2. chdir:改变当前工作路径

#include <unistd.h> int chdir(const char *path);
  • 功能:将当前进程的工作目录切换到path指定的路径。
  • 参数path:需要切换的目标路径(可使用绝对路径或相对路径)。
  • 返回值
    • 成功:返回0
    • 失败:返回-1(并设置errno,如路径不存在)。

注意点

chdir仅修改当前进程的工作路径,若在子进程中调用chdir,不会影响父进程的工作路径(进程间环境相互独立)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 1:42:56

大语言模型推理极致优化:TensorRT-LLM高性能推理实践指南

大语言模型推理极致优化&#xff1a;TensorRT-LLM技术详解与云上实践指南&#xff0c;系统性地介绍了如何使用 TensorRT-LLM 优化大语言模型推理性能。 一、背景与挑战 大语言模型&#xff08;LLM&#xff09; 是基于海量数据预训练的超大规模深度学习模型&#xff0c;其基础是…

作者头像 李华
网站建设 2026/4/19 18:21:12

C#实现HC32L130 CRC16校验

要在 C# 中实现与小华 HC32L130 MCU 匹配的 CRC16 校验&#xff0c;需先明确HC32L130 的 CRC16 参数规则&#xff0c;再基于该规则编写 C# 代码。一、HC32L130 的 CRC16 参数解析从你提供的文档和 MCU 代码可提取核心参数&#xff1a;参数项具体值 / 规则多项式\(x^{16}x^{12}x…

作者头像 李华
网站建设 2026/4/29 22:48:30

告别局域网!SimpleMindMap+cpolar 让思维导图协作更自由

文章目录 前言1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 前言 SimpleMindMap 是一款可以自己部署的思维导图工具&#xff0c;能用来画项目计划、产品架构、会议纪要等&#xff0c;…

作者头像 李华
网站建设 2026/4/21 15:54:52

mootdx开源工具:通达信数据读取的完整解决方案

mootdx开源工具&#xff1a;通达信数据读取的完整解决方案 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域&#xff0c;通达信软件提供了丰富的市场数据资源。mootdx…

作者头像 李华
网站建设 2026/4/23 2:31:57

5分钟搞定wiliwili:从启动失败到流畅播放的完整解决方案

5分钟搞定wiliwili&#xff1a;从启动失败到流畅播放的完整解决方案 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili…

作者头像 李华
网站建设 2026/4/26 21:29:05

Editly容器化部署:革新视频创作工作流的终极方案

在当今数字内容爆炸的时代&#xff0c;视频创作已成为个人表达和企业营销的重要方式。然而&#xff0c;传统视频编辑软件复杂的安装过程、版本依赖冲突以及跨平台兼容性问题&#xff0c;让许多创作者望而却步。Editly容器化部署方案应运而生&#xff0c;彻底改变了这一现状&…

作者头像 李华