作用
- 在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何linux下可执行的脚本文件
- 就好比一个程序运行之后,可以在其运行的过程中调用别的程序
函数原型
-
-
返回值
-
exec族函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行
-
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { printf("before execl\n"); if(execl("abc.out","b","c",NULL) == -1){ printf("execl failed!\n"); perror("why");//调用失败会把失败的原因解析出来在why后面解析 } printf("after execl\n"); //如果调用成功了execl不会返回-1也就不会执行preeor,会进入调用的进程中,原来的进程会完全被调用的新进程代替,程序不会执行到这里。 //如果说失败了会设置errno并返回-1,然后从原程序调用点接着往下执行 return 0; }
-
-
参数说明
-
具体使用案例
-
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { /*实现对ls -l命令的实现(如果不知道linux命令所在目录可以使用(whereis 命令)来查找) printf("befor execl\n"); if(execl("/bin/ls","ls","-l",NULL) == -1){ printf("execl Failed!\n"); perror(""); } printf("after execl\n"); */ /*获取系统时间 printf("after execl\n"); if(execl("/bin/date","date",NULL,NULL) == -1){ printf("execl Failed!\n"); perror(""); } printf("after execl\n"); */ /*调用当前目录下的程序 printf("after execl\n"); if(execl("./b","b","123",NULL) == -1){//第一个参数地址不能只写到目录还得具体到执行程序名 //二个参数为可执行程序的参数:第一个为程序的名字是什么就写什么有.out就加上.out,剩下的都是可执行程序的参数如:ls -l中的-l,可执行程序的参数以NULL结尾 printf("execl Failed!\n"); perror(""); }*/ /*execl和execlp的区别:execlp不需要知道可执行程序的路径(其实也可以写:有'/'按路径处理,没有则按环境变量处理),但是可执行程序路径得配置为环境变量才可以 printf("after execp\n"); if(execlp("ls","-l",NULL) == -1){//ls所在路径已经默认配置为环境变量 printf("execl Failed!\n"); perror(""); } printf("after execl\n"); */ /*execv的用法和execl的区别:execv的第二个参数需要额外定义数组,再把数组传入 execvp和execv的区别就是execl和execlp的区别一样 char *argv[]={"ps",NULL,NULL}; printf("befor execl\n"); if(execv("/bin/ps",argv) == -1){ printf("execl Failed!\n"); perror(""); } printf("after execl\n"); */ printf("before execl\n"); if(execl("abc.out","b","c",NULL) == -1){ printf("execl failed!\n"); perror("why");//调用失败会把失败的原因解析出来在why后面解析,如果没有why则直接解析 } printf("after execl\n"); /*abc.c #include <stdio.h> int main(int argc,char **argv) { int i; for(i=0;i<argc;i++){ printf("%s\n",argv[i]); } return 0; } */ return 0; }
-
-
补充
-
环境变量
- 查看当前路径:pwd
- 查看当前环境变量:echo $PATH
- 修改环境变量:export PATH=原先的环境变量(使用$PATH:代替(不要少了冒号))+想配置的路径(注意:配置环境变量的时候一定要加上原先的环境变量,如果直接修改则原先的环境变量就不存在了)
-
exec后新进程保持原进程以下特征
- 实际用户ID和实际组ID
- 会话ID
- 当前工作目录
- …
- [关于我结合fork和exec函数使用体现exec后新进程保持原进程‘当前工作目录’案例]((39条消息) 关于fork与exec族函数结合跨目录修改文件所遇问题_Trt_ToHoldOn的博客-CSDN博客)
-
函数结合跨目录修改文件所遇问题_Trt_ToHoldOn的博客-CSDN博客](https://blog.csdn.net/aieiji123/article/details/128413575?spm=1001.2014.3001.5502))