目录
- 简介
- 函数原型
- 参数说明
- 返回值
- 函数区别
- 使用示例
- 采用参数列表传递参数,以 execl 为例
- 采用参数数组传递参数,以 execv 为例
- 调用 PATH 下可执行文件,以 execlp 为例
- 使用新的环境变量给新进程,以 execle 为例
 
- 更多内容
 
简介
exec 函数族是 Linux 系统中的系统调用函数,它们都以 exec 开头,共有 6 个,分别是 execl、execle、execlp、execv、execve、execvp,使用 exec 函数可以将当前的进程替换为一个新进程,且新进程与原进程具有相同的 PID。
函数原型
#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
参数说明
- path:指定要执行的可执行文件及其路径,可以是相对路径、也可以是绝对路径。
- arg:指定传递给可执行文件的一系列参数,以可变参数列表的形式,一般第一个参数为可执行文件的名称,且最后一个参数必须是- NULL。
- file:若参数中包含"- /"则视为路径并在指定路径下查找可执行文件,否则将在- PATH环境变量指定的路径中查找可执行文件。
- envp:指定新进程的环境变量,不使用当前的环境变量。
- argv:指定传递给可执行文件的一系列参数,以参数数组的形式,且该数组最后一个元素必须是- NULL。
返回值
- 成功:不返回,从新程序的 main 函数开始执行。
- 失败:返回 -1,继续执行原程序。
函数区别
分别以函数中的字符 l、p、v、e 说明:
- l:表示使用参数列表的形式传递参数。
- p:表示使用文件名,若不指定路径,将在 PATH 环境变量指定的路径中查找可执行文件。
- v:表示使用参数数组的形式传递参数。
- e:表示要使用新的环境变量给新进程。
使用示例
采用参数列表传递参数,以 execl 为例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execl("./test", "test", "Hello World!", (char *)NULL);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
- 执行效果如下:

采用参数数组传递参数,以 execv 为例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *argv[] = {"test", "Hello World!", (char *)NULL};printf("--- main begin ---\n");execv("./test", argv);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);return 0;
}
- 执行效果如下:

调用 PATH 下可执行文件,以 execlp 为例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{printf("--- main begin ---\n");execlp("ps", "ps", "-l", (char *)NULL);printf("--- main end ---\n");return 0;
}
- 执行效果如下:

使用新的环境变量给新进程,以 execle 为例
- 示例程序
// main.c
#include <stdio.h>
#include <unistd.h>int main(void)
{char *env_init[] = {"AA=aa", "BB=bb", NULL};printf("--- main begin ---\n");execle("./test", "test", "Hello World!", (char *)NULL, env_init);printf("--- main end ---\n");return 0;
}// test.c
#include <stdio.h>extern char **environ;int main(int argc, char *argv[])
{printf("%s: %s \r\n", argv[0], argv[1]);for (char **ptr = environ; *ptr != 0; ptr++){printf("%s\n", *ptr);}return 0;
}
- 执行效果如下:

更多内容
- CSDN博客:@Hello阿尔法
- 哔哩哔哩:@Hello阿尔法
- 知乎:@Hello阿尔法