一、exec函数族
1.1、exec函数族相关函数
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
1.1、exec函数族的作用
在linux下有时候我们希望可以在当前进程中载入来自外部的程序或者可以直接调用shell中的ps、ls等命令,这个时候exec函数族就可以派上用场了。
最后面带“e”的函数execve和execle还允许调用者将其环境变量传递给需要执行的程序;
1.2、exec函数族各个函数的作用
- execl用于指定路径下的命令或程序,如execl("/bin/ls",“ls”,"-l",(char*)0),表示执行“/bin/ls”目录下的“ls”命令,“-l”表示跟在“ls”后面的参数,这个函数以NULL表示参数的结束;
- execlp会从系统环境变量PATH指定的目录中查找符合file文件名的命令,然后执行。如execlp(“ls”,"-l",(char*)0),表示执行“ls -l”命令。
- execle除了可以执行指定路径下的程序或命令之外,还可以通过envp函数传递环境变量。
- execv、execvp、execvpe三个函数的功能分别和execl、execlp、execle相同,只是后者允许以二维数组的方式传递参数;
二、示例
以下例程均载入test.c函数,在shell中执行gcc test.c -o test
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
extern char **environ;//linux系统变量,存储环境变量的值
int main(int argc,char *argv[])
{
int i=0;
printf("*********test func***********\r\n");
for(i=0;i<argc;i++)
{
printf("arg[%d]:%s\r\n",i,argv[i]);
}
i=0;
while(0 != environ[i])//执行execl和execlp的时候把这段代码注释掉
{
printf("%s\r\n",environ[i]);
i++;
}
return 0;
}
2.1、execl和execv函数
#include <stdio.h>
#include "unistd.h"
int main(int argc,char *argv[])
{
char *arg[10] = {"hello","world"};
if(0 == strcmp(argv[1],"execl"))
{
if(execl("./test","hello","world",(char*)0)<0)
{
perror("execl error!\r\n");
}
}
else
{
if(execv("./test",arg)<0)
{
perror("execv error!\r\n");
}
}
}
执行结果:
2.2、execlp和execvp
这两个函数其实完全可以替代上面的execl和execv,不同的地方在于execlp和execvp可以从系统的PATH环境变量中查找需要执行的文件,而execl和execv必须要写出完整的路径名。
#include <stdio.h>
#include "unistd.h"
int main(int argc,char *argv[])
{
char *arg[10] = {"hello","execlp"};
if(0 == strcmp(argv[1],"execlp"))
{
if(execlp("./test","hello","execlp",(char*)0)<0)
{
perror("execl error!\r\n");
}
}
else
{
if(execvp("./test",arg)<0)
{
perror("execv error!\r\n");
}
printf("execv sucess\r\n");
}
}
执行结果
2.3、execle和execve
#include <stdio.h>
#include "unistd.h"
int main(int argc,char *argv[])
{
char *arg[10] = {"hello","execve"};
char *env[10] = {"TEST1=test1"};
if(0 == strcmp(argv[1],"execle"))
{
if(execle("./test","hello","execle",(char*)0,env)<0)
{
perror("execle error!\r\n");
}
}
else
{
if(execve("./test",arg,env)<0)
{
perror("execve error!\r\n");
}
printf("execve sucess\r\n");
}
}
执行结果