比较常用的是
execlp函数:使用PATH环境变量名加载程序
execl函数:使用路径+程序名加载程序
在Linux中,exec
函数族是一组用于执行新程序的函数。它们可以用于替换当前进程的映像,从而在同一个进程中执行不同的程序。以下是Linux中常见的exec
函数族的一些函数:
1.int execl(const char *path, const char *arg, ...)
这个函数用于执行一个指定的可执行文件。它接受一个文件路径作为参数,后面跟着可选的命令行参数,最后以NULL
作为结束符。该函数会用指定的可执行文件替换当前进程的映像,并开始执行新程序。例如:
execl("/bin/ls", "ls", "-l", NULL);
2.int execv(const char *path, char *const argv[])
这个函数与execl
类似,但它接受一个参数数组来传递命令行参数。参数数组中的第一个元素通常是可执行文件的路径,接下来是命令行参数,以NULL
作为结束符。例如:
char *args[] = {"ls", "-l", NULL};
execv("/bin/ls", args);
3.int execle(const char *path, const char *arg, ..., char *const envp[])
这个函数与execl
类似,但它还接受一个环境变量数组作为参数。环境变量数组用于传递自定义的环境变量给新程序。例如:
char *env[] = {"HOME=/home/user", "PATH=/usr/bin", NULL};
execle("/bin/ls", "ls", "-l", NULL, env);
4.int execvp(const char *file, char *const argv[])
这个函数与execv
类似,但它会在系统的PATH
环境变量中搜索可执行文件的路径。它可以使用不带路径的可执行文件名来执行程序。例如:
char *args[] = {"ls", "-l", NULL};
execvp("ls", args);
这些函数族中的每个函数在成功执行时不会返回,而是直接将控制权转移到新程序。如果执行失败,它们会返回一个负值,并且可以使用perror
函数来获取详细的错误信息。
5.execve
:
#include <unistd.h>
int execve(const char *pathname, char *const argv[], char *const envp[]);
pathname
是要执行的可执行程序的路径。argv
是一个以NULL
结尾的字符串数组,表示要传递给新程序的命令行参数。envp
是一个以NULL
结尾的字符串数组,表示要传递给新程序的环境变量。
#include <unistd.h>
int main() {
char *argv[] = { "/path/to/executable", "arg1", "arg2", NULL };
char *envp[] = { "VAR1=value1", "VAR2=value2", NULL };
execve("/path/to/executable", argv, envp);
// 如果execve执行成功,下面的代码将不会被执行
perror("execve"); // 打印错误信息
return -1;
}
6.execlp
:
#include <unistd.h>
int execlp(const char *filename, const char *arg0, ... /* (char *) NULL */);
filename
是要执行的可执行程序的名称。在execlp
中,会在$PATH
环境变量指定的路径中搜索该程序。arg0
以及后面的参数是要传递给新程序的命令行参数,最后一个参数必须是NULL
。
#include <unistd.h>
int main() {
execlp("executable", "executable", "arg1", "arg2", NULL);
// 如果execlp执行成功,下面的代码将不会被执行
perror("execlp"); // 打印错误信息
return -1;
}