1 exec函数族
1.1 函数介绍
常用后缀:
- l:代表以列表形式传参(list)
- v:代表以矢量数组形式传参(vector)
- p:代表使用环境变量Path来寻找指定执行文件
- e:代表用户提供自定义的环境变量
头文件:
#include <unistd.h>
函数原型:
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 execve(const char *path, char *const argv[], char *const envp[]);
返回值:
- 成功:不返回
- 失败:-1
1.2 函数测试
函数execl:
int execl(const char *path, const char *arg, ...);
execl()函数用于执行参数path字符串所代表的文件路径(必须指定路径),接下来是一系列可变参数,它们代表执行该文件时传递过去的 argv[0]、argv[1]… argv[n] ,最后一个参数必须用空指针NULL作为结束的标志。
int main(void)
{
int err;
printf("this is a execl function test demo!\n\n");
err = execl("/bin/ls", "ls", "-la", NULL);
if (err < 0) {
printf("execl fail!\n\n");
}
printf("Done!\n\n");
}
函数execlp:
int execlp(const char *file, const char *arg, ...);
execlp()函数会从PATH环境变量所指的目录中查找符合参数file的文件名(不需要指定路径),找到后便执行该文件,然后将第二个以后的参数当做该文件的 argv[0]、argv[1]… argv[n] , 最后一个参数必须用空指针NULL作为结束的标志。
int main(void)
{
int err;
printf("this is a execlp function test demo!\n\n");
err = execlp("ls", "ls", "-la", NULL);
if (err < 0) {
printf("execlp fail!\n\n");
}
}
函数execle:
int execle(const char *path, const char *arg, ..., char *const envp[]);
execle()函数用于执行参数path字符串所代表的文件路径(必须指定路径),并为新程序复制最后一个参数所指示的环境变量(envp)。
int main(void)
{
int err;
char *envp[] = {
"/bin", NULL
};
printf("this is a execle function test demo!\n\n");
err = execle("/bin/ls", "ls", "-la", NULL, envp);
if (err < 0) {
printf("execle fail!\n\n");
}
}
函数execv:
int execv(const char *path, char *const argv[]);
execv()函数用于执行参数path字符串所代表的文件路径(必须指定路径),接着传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1]… argv[n] ,以空指针NULL结束。
int main(void)
{
int err;
char *argv[] = {
"ls", "-la", NULL
};
printf("this is a execv function test demo!\n\n");
err = execv("/bin/ls", argv);
if (err < 0) {
printf("execv fail!\n\n");
}
}
函数execvp:
int execvp(const char *path, char *const argv[]);
execvp()函数会从PATH环境变量所指的目录中查找符合参数file的文件名(不需要指定路径),找到该文件后便执行该文件,接着传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1] … argv[n] ,以空指针NULL结束。
int main(void)
{
int err;
char *argv[] = {
"ls", "-la", NULL
};
printf("this is a execvp function test demo!\n\n");
err = execvp("ls", argv);
if (err < 0) {
printf("execvp fail!\n\n");
}
}
函数execve:
int execve(const char *path, char *const argv[], char *const envp[]);
execve()函数用于执行参数path字符串所代表的文件路径(必须指定路径),执行该文件时会传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1] … argv[n] ,除此之外该函数还会为新程序复制最后一个参数所指示的环境变量(envp)。
int main(void)
{
int err;
char *argv[] = {
"ls", "-la", NULL
};
char *envp[] = {
"/bin", NULL
};
printf("this is a execve function test demo!\n\n");
err = execve("/bin/ls", argv, envp);
if (err < 0) {
printf("execve fail!\n\n");
}
}
1.3 要点总结
要点:
- l后缀和v后缀必须两者选其一来使用
- p后缀和e后缀是可选的,可用可不用
- 组合后缀的相关函数还有很多,可自己进一步了解
exce函数有可能执行失败,需要预防:
- 新程序的文件路径出错
- 传参或者是自定义环境变量时,没有加NULL
- 新程序没有执行权限
参考资料:
1499

被折叠的 条评论
为什么被折叠?



