linux之 execl函数族

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族函数是有可能执行失败的,要在代码中对此进行判断。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值