exec()系列函数

hisun9 / 2024-12-14 / 原文

exec() 系列函数用于在当前进程中执行新的程序,它们是 Unix/Linux 系统中实现进程控制的重要组成部分。这些函数可以替换当前进程的映像,使其执行不同的程序,而不是创建新的进程。

下面介绍主要的exec() 系列函数:

1. execl

用法:

接受程序路径、参数列表,参数以 NULL 结束。

示例:

execl("/bin/ls", "ls", "-l", NULL);

这个示例将当前进程替换为 /bin/ls 程序,参数为 -l

2. execle

用法:

类似于 execl,但可以指定环境变量,最后一个参数为环境变量数组。

示例:

char *env[] = {"PATH=/usr/bin", NULL};
execle("/bin/ls", "ls", "-l", NULL, env);

3. execlp

execlp 的特点是它会自动在 PATH 环境变量中查找指定的可执行文件,因此不需要提供完整的路径。

int execlp(const char *file, const char *arg0, ..., (char *) NULL);
  • file:要执行的程序的名称,可以是程序的名称而不需要指定完整路径。

  • arg0:传递给程序的第一个参数,通常是程序本身的名称。

  • ...:后续的参数是传递给程序的其他参数,最后必须以 NULL 结尾。

4. execv

用法:

接受程序路径和参数数组,参数以 NULL 结束。

示例:

char *args[] = {"ls", "-l", NULL};
execv("/bin/ls", args);

这个示例与 execl 类似,但是参数以数组形式传递。

5. execve

用法:

底层的实现,接受程序路径、参数数组和环境变量数组。

示例:

char *args[] = {"ls", "-l", NULL};
char *env[] = {NULL};
execve("/bin/ls", args, env);

6. execvp

用法:

用于执行指定的程序,它会根据环境变量 PATH 自动查找可执行文件。它与 execv 类似,但 execvp 的第一个参数是文件名,而不是文件的完整路径。

语法:

int execvp(const char *file, char *const argv[]);
  • file:要执行的程序的名称(不需要完整路径,execvp 会根据 PATH 查找)。

  • argv:参数数组,以 NULL 结尾。数组的第一个元素通常是程序的名称。
    返回值:成功时不会返回;如果失败,返回 -1,并设置 errno。