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 始终不变

相关推荐
钱栈up12 小时前
耳机音效不对,我顺手查了系统更新,结果挖出个崩溃了整天的服务
windows·shell
xiao77mwq12 小时前
Wireshark 在 Windows 上没法按进程抓包,我补了一条路
windows
Helix25013 小时前
MDT自动化部署实战:构建企业级Windows批量装机与PXE网络引导环境
windows·mdt自动化部署·wds网络启动·pxe引导·windows批量装机·任务序列·无人值守安装
学IT的周星星14 小时前
记忆系统:让 Agent 记住你是谁、上次聊到哪
运维·服务器·人工智能·windows·大模型·llm·agent
撞强15 小时前
Windows 上从零开始:Obsidian + Copilot(Icompify)+ 客户洞察实战 · 图文指南
windows·copilot·obsidian·icompify
weixin_5716674116 小时前
Windows 通过 SSH 反向隧道向 Ubuntu 转发代理
linux·运维·windows·代理
事圆则缓17 小时前
Kotlin 集合与序列:给页面一份清楚的数据
开发语言·windows·kotlin
遇印记17 小时前
应用层,网络管理
运维·网络·windows·学习·安全
硫酸锌0119 小时前
安卓手机连接Windows电脑后通过DHCP服务为手机分配IP地址
android·windows·计算机网络
ClickHouseDB20 小时前
ClickHouse .NET 驱动程序新特性:从 1.0 到 1.3 的演进之路
java·前端·windows