1、为什么要使用exec族函数 当我们fork一个子进程就是为了执行一个新的程序,此时可以调用exec族函数,执行已经编译好的可执行程序或者Linux自带的ls、cd等命令。 2、exec族函数如何使用
函数原型: #include <unistd.h> extern char **environ; 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[]); 参数说明: path:可执行程序的路径名 arg:可执行性程序的参数,第一个arg是可执行性程序的文件名,第二个至最后一个arg是可执行性程序的参数,若没有参数必须以NULL结尾 file:可执行性程序的文件名 argv[]:可执行性程序的参数列表3、exec族函数的理解比较 1)execl与execv: execl是把参数列表依次写入arg中,本质上是多个字符串,必须以NULL结尾 execv是把参数列表存放到一个字符数组argv[]中,一块传参
2)execl与execlp: execl传的是可执行性程序的路径名 execlp传的是可执行性程序的文件名,其路径是根据环境变量PATH底下的文件中查 找该文件名 相关环境变量指令: whereis date 功能:查找date指令的绝对路径 /bin/date echo $PATH 功能:当前环境变量 export PATH = $PATH:当前文件路径 功能:把当前文件路径放到环境变量中 环境变量说明:环境变量中的可执行性程序,可在任意文件夹下使用,敲写该文件 名便可执行可执行性程序,不用加 “ ./ ” 。 4、exevl函数demo说明
//demo.c #include <stdio.h> #include <unistd.h> int main() { printf("before execl\n"); if(execl("./test","test","123",NULL)==-1) { printf("execl failed\n"); perror("why"); } printf("after execl\n");//若execl函数成功执行,此语句将不在执行 } //test.c #include <stdio.h> int main(int argc,char **argv) { int i; for(i = 0;i<argc;i++) { printf("argv[%d] is %s\n",i,argv[i]); } return 0; } //执行结果 before execl argv[0] is test argv[1] is 1235、execlp函数demo说明
#include <unistd.h> #include <stdio.h> int main() { printf("system date show\n"); if(execlp("date","date",NULL)==-1) { printf("execlp failed\n"); } return 0; } //执行结果 system date show Thu Jul 2 17:48:17 CST 20206、execv函数demo说明
//函数原型:int execv( const char *path, char *const argv[]); #include <stdio.h> #include <unistd.h> int main() { char *argv[] = {"ps","-aux",NULL}; if(execv("/bin/ps",argv)==-1) { printf("execv failed\n"); } return 0; } //执行结果 查看当前进程