execvp(cmd, myargv) 是 Unix/Linux 系统编程中用于执行新程序的系统调用函数。其作用是将当前进程替换为新的程序,并传递命令行参数。以下是详细解释:


函数原型

c

#include <unistd.h>
int execvp(const char *file, char *const argv[]);
  • file:要执行的程序名(可以是文件名或路径)

  • argv[]:参数数组(类似 main() 函数的 argv

  • 返回值:成功时不返回(原进程被新程序替换);失败返回 -1


关键特性

  1. 搜索路径

    • 若 file 不含 /(如 "ls"),则自动在 PATH 环境变量指定的目录中搜索可执行文件。

    • 若含 /(如 "./a.out"),则直接执行该路径的程序。

  2. 参数传递

    • argv 必须以 NULL 结尾(例如:{"ls", "-l", NULL})。

    • 约定 argv[0] 为程序名(通常与 file 一致)。

  3. 进程替换

    • 成功时:当前进程的代码/数据被新程序覆盖,进程ID不变,但运行的是新程序。

    • 失败时:返回错误(如文件不存在),原进程继续执行。


示例代码

c

#include <unistd.h>
#include <stdio.h>

int main() {
    char *cmd = "ls";         // 要执行的程序(在PATH中搜索)
    char *myargv[] = {
        "ls",                // argv[0](程序名)
        "-l",                // 参数1:详细列表
        "/home",             // 参数2:目录路径
        NULL                 // 必须用NULL结尾
    };

    execvp(cmd, myargv);     // 执行 ls -l /home

    // 只有 execvp 失败时才会执行到这里
    perror("execvp failed"); // 打印错误信息
    return 1;
}

执行效果

  • 若成功:运行 ls -l /home,原进程被替换,不再返回。

  • 若失败(如 ls 不存在):

    bash

    execvp failed: No such file or directory

常见用途

  1. 在 Shell 中实现命令执行(如 lsgcc)。

  2. 结合 fork() 创建子进程执行新程序(父进程继续运行)。

    c

    pid_t pid = fork();
    if (pid == 0) {
        execvp("child_program", args); // 子进程执行新程序
    } else {
        wait(NULL); // 父进程等待子进程结束
    }

注意事项

  1. 参数数组必须以 NULL 结尾,否则会导致未定义行为。

  2. 环境变量:默认继承父进程的环境(可用 execvpe() 自定义环境)。

  3. 错误处理:务必检查返回值,失败时需处理错误(如文件权限不足、路径错误等)。

通过 execvp(),程序可以动态加载并执行其他命令,是系统编程中进程控制的核心工具之一。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐