本文共 3147 字,大约阅读时间需要 10 分钟。
文章目录
1 exec函数族
1.1 函数介绍
常用后缀:
- l:代表以列表形式传参(list)
- v:代表以矢量数组形式传参(vector)
- p:代表使用环境变量Path来寻找指定执行文件
- e:代表用户提供自定义的环境变量
头文件:
#include
函数原型:
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
- 新程序没有执行权限
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/107730473 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!