嵌入式第三十五篇——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,不会影响父进程的工作路径(进程间环境相互独立)。

相关推荐
是江迪呀9 分钟前
介绍一个开源项目 —— 烂笔头
前端·后端
西索斯coding14 分钟前
qwen3.8-max 和 minimax-m3 改后端仓库实测复核:补丁通过率与调用成本别急着排冠军
linux·运维·ubuntu·ai
恋猫de小郭14 分钟前
Flutter 紧急发布 3.47.8 安全升级版本,建议都升级
android·前端·flutter
紧跟先前的步伐16 分钟前
Go AI Agent 实战 18|Tool Calling 的基本原理与完整执行流程
前端·数据库·人工智能·ai·golang·1024程序员节
captain37620 分钟前
Spring Web MVC(2)
java·前端·spring boot·后端·spring·mvc
晓得迷路了27 分钟前
栗子前端技术周刊第 151 期 - ViteConf 2026、React Router 8.5、React Native 0.88...
前端·javascript·vue.js
代码山河32 分钟前
调试技巧:IDEA Debug模式入门与使用
java·学习·架构·教程·面向对象·项目
ai工具集合32 分钟前
老项目位图图标放大模糊?PNG 一键转 SVG 矢量化实操,附前端避坑指南
前端
2601_9687080335 分钟前
DreamsChat Web – Chat, Audio, Video Web APP with Admin Dashboard
前端·架构
外收内放37 分钟前
FastAPI猜字谜实战(5):会话管理
开发语言·python·学习·fastapi