execl函数族常用后缀:
- l:代表以列表形式传参
- p:代表使用环境变量PATH来寻找指定执行文件
- v:代表以数量数组形式传参
- e:代表用户提供自定义的环境变量
头文件
#include<unistd.h>
函数原型
int execl (const char *path,const char *arg, ...);
#include<stdio.h>
#include<unistd.h>//该函数所需要的头文件,标准库文件最好用 < 和 >
int main(int argc,char** argv)
{
pid_t result;
result = fork();
if(result > 0)//父进程,result值为fork()产生的子进程的pid值
{
execl("/bin/ls","ls","-l",NULL);//最后必须加上NULL,表示参数的结束
//execl若执行成功,则此时已经跳到另一个进程(ls -l),接下来的部分不会被执行。
printf("Error!\r\n");
return -1;
}
return 0;
}
//编译这个.c,执行效果同shell指令 ls -l
//我就不把执行结果贴上来了。
int execlp(const char *file,const char *arg, ...);
#include<stdio.h>
#include<unistd.h>
int main(int argc,char** argv)
{
pid_t result;
result = fork();
if(result > 0)//父进程,result为子进程的pid
{
execlp("ls","ls","-l",NULL);//NULL表示参数结尾
//注意此处execlp的第一参数只写了程序名,没有指明路径,因为
//execlp函数 使用环境变量Path来寻找指定执行文件!!!
//shell环境变量PATH里面保存了/bin这个目录
printf("Error!\r\n");
return -1;
}
return 0;
}
//执行效果同shell指令 ls -l
int execv(const char* path,char* const argv[]);
#include<stdio.h>
#include<unistd.h>
int main(int argc,char** argv)
{
pid_t result;
char *arg[] = {"ls","-l",NULL};
//其实execv就是通过一个字符串数组来传参,注意最后一个元素要是NULL,表示结束
result = fork();
if(result > 0)//父进程,result为子进程的pid
{
execlv("/bin/ls",arg);//NULL表示参数结尾
printf("Error!\r\n");
return -1;
}
return 0;
}
//执行效果同shell指令 ls -l
int execve(const char* path, char* const argv[], char * const envp[] );
//子进程使用自定义的环境变量,不继承父进程的。
#include<stdio.h>
#include<unistd.h>
int main(int argc,char** argv)
{
pid_t result;
char *arg[] = {"env",NULL};
char *env[] = {"PATH=/tmp","name=Layne",NULL};
//该数组用来设置自定义的环境变量,注意必须要以NULL结尾。
result = fork();
if(result > 0)//父进程,子进程的pid
{
execve("/usr/bin/env",arg,env);//NULL表示参数结尾
printf("Error!\r\n");
return -1;
}
return 0;
}
/*
执行结果:
jl@jl-virtual-machine:~/test$ ./a.out
PATH=/tmp
name=Layne
jl@jl-virtual-machine:~/test$
*/
总结:
- execlp 和 execve是附加功能
execl <-----> execlp
execv <-----> execve
还有其他很多组合方式,这里就不一一介绍了。 - excel族函数是有可能执行失败的,要在代码中对此进行判断。