Linux exec函数族

一、核心概述

作用 :fork 创建子进程后,子进程默认与父进程代码一致,通过 exec 函数可以覆盖当前进程程序,执行全新的可执行文件。

核心特性

  • 进程 PID 不变,仅替换代码段、数据段;继承已打开的文件描述符

  • 成功无返回,exec 后续代码永不执行

  • 失败返回 -1,继续执行后续代码

  • 标准流程:fork() 创建子进程 → 子进程调用 exec → 父进程 wait() 回收子进程

二、函数后缀含义

  • l(list):逐个罗列参数,可变参数,末尾必须 NULL

  • v(vector):参数存入字符串数组,数组末尾必须 NULL

  • p(PATH):通过系统 PATH 环境变量搜索程序,无需写绝对路径

统一头文件:#include <unistd.h>

三、四大常用函数(声明 + 完整代码示例)

1. execl(绝对路径 + 列表传参)

函数声明

cs 复制代码
int execl(const char *pathname, const char *arg, ..., (char *)NULL);

代码示例

cs 复制代码
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

int main()
{
    pid_t pid = fork();
    if (pid == 0)
    {
        execl("/bin/ls", "ls", "-l", NULL);
        perror("execl fail");
        _exit(-1);
    }
    wait(NULL);
    return 0;
}

2. execv(绝对路径 + 数组传参)

函数声明

cs 复制代码
int execv(const char *pathname, char *const argv[]);

3. execlp(PATH搜索 + 列表传参)

函数声明

cs 复制代码
int execlp(const char *file, const char *arg, ..., (char *)NULL);

代码示例

cs 复制代码
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

int main()
{
    pid_t pid = fork();
    if (pid == 0)
    {
        execlp("ls", "ls", "-l", NULL);
        perror("execlp fail");
        _exit(-1);
    }
    wait(NULL);
    return 0;
}

4. execvp(PATH搜索 + 数组传参)

函数声明

cs 复制代码
int execvp(const char *file, char *const argv[]);

代码示例

cs 复制代码
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

int main()
{
    pid_t pid = fork();
    if (pid == 0)
    {
        char *argv[] = {"ls", "-l", NULL};
        execvp("ls", argv);
        perror("execvp fail");
        _exit(-1);
    }
    wait(NULL);
    return 0;
}

四、函数对比速查表

函数名 传参方式 是否需要绝对路径
execl 列表逐个传参 需要
execv 字符串数组传参 需要
execlp 列表逐个传参 不需要(依赖PATH)
execvp 字符串数组传参 不需要(依赖PATH)

五、必考易错点

  1. 参数列表 / 字符串数组 末尾必须以 NULL 结尾,缺一报错

  2. 带 p 后缀函数,自定义程序需将所在目录添加到 PATH 环境变量

  3. exec 执行失败后,必须用_exit(-1) 退出子进程,防止乱走父进程逻辑

  4. exec 只替换程序,不创建新进程,PID 始终不变

相关推荐
键盘会跳舞2 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
秋名RG5 小时前
Java 集合框架完全指南:从核心接口到 JDK 21 有序集合新特性
java·windows
宋军涛5 小时前
Windows 操作系统【任务计划程序】简单使用
服务器·windows
秋名RG8 小时前
Java 泛型深度解析:从类型安全到现代实践(JDK 21 视角)
java·windows·安全
奈斯先生Vector8 小时前
AIGC 视频生成换个拍法:用 Kling Video 把一张人物图变成可剪辑的短故事
开发语言·人工智能·windows·python·aigc·音视频
kakakahahahaha10 小时前
Windows重装后D盘要求48位BitLocker恢复密钥的排查与处理
windows·电脑·内容运营·软件需求
技术不好的崎鸣同学1 天前
第一章:PEB结构解析与内存定位
windows·安全·系统安全
江湖人称菠萝包1 天前
【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter1-基础知识
windows·笔记
白山编程大哥1 天前
Java 迭代器接口详解:从 Iterator 到 ListIterator 的完整指南
java·开发语言·windows