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 123
5、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 2020
6、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;
}
//执行结果
查看当前进程