exec函数簇是一组用于在现有进程中执行另一个程序的系统调用。这些函数允许当前进程的上下文被替换为新程序的上下文,从而实现程序的动态执行。
exec函数簇概述
exec函数簇用于在现有进程中执行另一个程序,替换当前进程的映像。调用exec函数后,当前进程的用户空间代码和数据将被新程序替换,从新程序的启动例程开始执行。
exec函数簇成员列表
以下是exec函数簇的主要成员及其功能说明:
函数名 | 功能 |
---|---|
execl | 使用完整的路径名执行程序,参数以可变参数列表形式传递。 |
execlp | 使用文件名执行程序,系统自动从PATH环境变量中查找可执行文件。 |
execle | 使用完整的路径名执行程序,允许显式传递环境变量数组。 |
execv | 使用完整的路径名执行程序,参数以字符指针数组形式传递。 |
execvp | 使用文件名执行程序,系统自动从PATH环境变量中查找可执行文件,参数以数组传递。 |
execve | 使用完整的路径名执行程序,允许显式传递环境变量数组,参数以数组传递。 |
fexecve | 使用文件描述符执行程序,参数和环境变量以数组形式传递。 |
各函数详细说明
1. execl
- 功能:使用完整的路径名执行程序,参数以可变参数列表形式传递。
- 函数原型:
int execl(const char *path, const char *arg0, ...);
- 参数:
path
:要执行的可执行文件的完整路径。arg0
:传递给新程序的第一个参数,通常是程序的名称。...
:以NULL
结尾的可变参数列表。
- 示例:
execl("/bin/ls", "ls", "-l", NULL); // 执行 ls -l 命令
- 适用场景:当需要显式指定可执行文件的路径,并且参数以可变参数形式传递时使用。
2. execlp
- 功能:使用文件名执行程序,系统自动从PATH环境变量中查找可执行文件。
- 函数原型:
int execlp(const char *file, const char *arg0, ...);
- 参数:
file
:要执行的可执行文件的文件名。arg0
:传递给新程序的第一个参数,通常是程序的名称。...
:以NULL
结尾的可变参数列表。
- 示例:
execlp("ls", "ls", "-l", NULL); // 执行 ls -l 命令,系统自动查找 PATH 中的 ls
- 适用场景:当希望系统自动查找可执行文件的路径时使用。
3. execle
- 功能:使用完整的路径名执行程序,允许显式传递环境变量数组。
- 函数原型:
int execle(const char *path, const char *arg0, ..., char *const envp[]);
- 参数:
path
:要执行的可执行文件的完整路径。arg0
:传递给新程序的第一个参数。...
:以NULL
结尾的可变参数列表。envp
:指向环境变量数组的指针。
- 示例:
char *env[] = {"PATH=/bin", "TERM=xterm", NULL}; execle("/bin/ls", "ls", "-l", NULL, env); // 执行 ls -l 命令,并设置环境变量
- 适用场景:当需要显式指定环境变量时使用。
4. execv
- 功能:使用完整的路径名执行程序,参数以字符指针数组形式传递。
- 函数原型:
int execv(const char *path, char *const argv[]);
- 参数:
path
:要执行的可执行文件的完整路径。argv
:指向参数数组的指针,数组以NULL
结尾。
- 示例:
char *argv[] = {"ls", "-l", NULL}; execv("/bin/ls", argv); // 执行 ls -l 命令
- 适用场景:当参数以数组形式传递时使用。
5. execvp
- 功能:使用文件名执行程序,系统自动从PATH环境变量中查找可执行文件,参数以数组形式传递。
- 函数原型:
int execvp(const char *file, char *const argv[]);
- 参数:
file
:要执行的可执行文件的文件名。argv
:指向参数数组的指针,数组以NULL
结尾。
- 示例:
char *argv[] = {"ls", "-l", NULL}; execvp("ls", argv); // 执行 ls -l 命令,系统自动查找 PATH 中的 ls
- 适用场景:当希望系统自动查找可执行文件的路径,并且参数以数组形式传递时使用。
6. execve
- 功能:使用完整的路径名执行程序,允许显式传递环境变量数组,参数以数组形式传递。
- 函数原型:
int execve(const char *path, char *const argv[], char *const envp[]);
- 参数:
path
:要执行的可执行文件的完整路径。argv
:指向参数数组的指针,数组以NULL
结尾。envp
:指向环境变量数组的指针。
- 示例:
char *argv[] = {"ls", "-l", NULL}; char *env[] = {"PATH=/bin", "TERM=xterm", NULL}; execve("/bin/ls", argv, env); // 执行 ls -l 命令,并设置环境变量
- 适用场景:当需要显式指定环境变量时使用。
7. fexecve
- 功能:使用文件描述符执行程序,参数和环境变量以数组形式传递。
- 函数原型:
int fexecve(int fd, char *const argv[], char *const envp[]);
- 参数:
fd
:指向可执行文件的文件描述符。argv
:指向参数数组的指针,数组以NULL
结尾。envp
:指向环境变量数组的指针。
- 示例:
int fd = open("/bin/ls", O_RDONLY); char *argv[] = {"ls", "-l", NULL}; char *env[] = {"PATH=/bin", "TERM=xterm", NULL}; fexecve(fd, argv, env); // 执行 ls -l 命令
- 适用场景:当需要通过文件描述符执行程序时使用,通常用于安全场景,防止路径注入攻击。
总结
exec函数簇提供了多种方式在现有进程中执行另一个程序,适用于不同的场景和需求。选择合适的函数可以根据是否需要显式指定路径、参数传递方式以及环境变量的控制。通过合理使用这些函数,可以实现灵活且高效的程序执行。