exec 是一个在 Unix 和类 Unix 系统(包括 Linux)中的系统调用,用于在当前进程的上下文中执行一个程序。当 exec 被调用时,当前进程的映像(即代码、数据、堆和栈)被新程序完全替换,而进程 ID 保持不变。这意味着 exec 调用之后的代码(即 exec 调用之后的语句)不会被执行,除非 exec 调用失败。
exec 有多个变种函数,它们之间的主要区别在于如何传递命令行参数和环境变量,以及目标程序的指定方式。以下是一些常见的 exec 变种函数:
execl()
int execl(const char *path, const char arg0, ... / (char *) NULL */);
path 是要执行的程序的完整路径。
arg0, arg1, ... 是传递给新程序的命令行参数列表,必须以 (char *) NULL 结尾。
execlp()
int execlp(const char *file, const char arg0, ... /, (char *) NULL */);
file 是要执行的程序的文件名,它会在环境变量 PATH 中搜索。
arg0, arg1, ... 是传递给新程序的命令行参数列表,必须以 (char *) NULL 结尾。
execle()
int execle(const char *path, const char arg0, ... /, (char *) NULL, char *const envp[] */);
除了命令行参数外,此函数还允许通过 envp 参数传递环境变量。
execv()
int execv(const char *path, char *const argv[]);
path 是要执行的程序的完整路径。
argv 是一个指向字符指针数组的指针,数组中的每个元素都是一个命令行参数,数组必须以 NULL 结尾。
execvp()
int execvp(const char *file, char *const argv[]);
file 是要执行的程序的文件名,它会在环境变量 PATH 中搜索。
argv 是一个指向字符指针数组的指针,数组中的每个元素都是一个命令行参数,数组必须以 NULL 结尾。
execvpe()
int execvpe(const char *file, char *const argv[], char *const envp[]);
此函数结合了 execvp 和 execle 的功能,既允许通过文件名搜索程序,又允许传递自定义的环境变量。
在使用这些函数时,需要小心处理命令行参数和环境变量,确保它们是正确和安全的。不正确的使用可能导致安全漏洞,如缓冲区溢出或命令注入攻击。