Linux下exec函数族(execl,execv,execle,execve,execlp,execvp,fexecve)的使用和对比

Linux下exec函数族(execl,execv,execle,execve,execlp,execvp,fexecve)的使用和对比

exec函数是提供fork创建新的线程后,执行外部程序的一个接口,当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,且从新程序的main函数开始执行。因为exec不创建新的进程,所以前后的进程ID不变。

1、int execl(const char * path,const char * arg0,.../* NULL */);
功能:
该函数可以将path指定的路径下的arg程序启动起来,从main函数开始执行
参数: 
path要执行的可执行程序的路径+名称
arg0 要执行的可执行程序的第一个参数
... 可执行程序的参数arg1,arg2 ...,所有的参数最后必须以NULL结尾。
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

int execv(const char * path,char * const argv[]);
功能:同上
参数: 
path 要执行的可执行程序的名称+路径
  argv 要执行的程序的参数数组
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.
   
int execle(const char * path,const char * arg0,.../* NULL */,char *const envp[] );
功能:同上
参数: 
path 要执行的可执行程序的名称+路径
  argv 要执行的程序的参数数组
envp 传递环境表信息environ,一个指向环境字符串指针的指针数组
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.

int execve(const char * path,char * const argv[],char * const envp[]);
功能和参数 参考 execv execle


2、int execlp(const char *filename,const char * arg0,...);
功能:
直接给出程序的名称和参数即可调用启动。
参数: 
filename要执行的可执行程序名称,从PATH环境变量中查找文件并执行
如果filename中包含/,则就将其视为路径名
否则就以PATH环境变量搜寻可执行文件
  arg0 ...可执行程序的参数列表,想当与主函数传参中的argv[0]...;
返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.


int execvp(const char *filename,char * const argv[])
功能和参数 参考 execv execlp

3、int fexecve(int fd,char *const argv[],char *const envp[]);
功能:
以打开的程序文件描述符为启动程序
参数: 
fd 要执行的可执行程序文件描述符
  argv[] 可执行程序的参数数组
  envp 传递环境表信息environ,一个指向环境字符串指针的指针数组

返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中.


exec族函数名中 l 表示列表list,v 表示数组

  execl、execlp、execle 将新程序的每个命令行参数都以一个单独的参数,这种参数列表以NULL结尾

  execv、execvp、execve和fexecve 则应先构造一个指向各参数的指针数组,然后将该数组地址作为参数传入

exec族函数名中 p结尾表示函数第一个参数取filename

  execlp、execvp与其他函数不同就是第一个参数取filename,并且用PATH环境变量寻找可执行文件
  filename 既可以是文件路径加程序名,也可以是PATH环境变量下的 /sbin: /bin: /usr/bin: 即shell命令


exec族函数名中 e结尾表示可以传递环境表信息environ

  execle、execve、fexecve 可以传递一个指向环境字符串指针数组的指针

下边是执行的一个例程

#include "head.h"

int main(int argc, const char *argv[])
{
	pid_t pd;

	printf("pid=%d ppid=%d\n",getpid(),getppid());
	pd = fork();

	if(pd == 0)
	{
		printf("pid=%d ppid=%d pd=%d\n",getpid(),getppid());
		char cwdpath[64];
		getcwd(cwdpath,sizeof(cwdpath));
		printf("cwdpath:%s\n",cwdpath);
		int ret = execl("./hello","user",NULL);
		printf("execl return = %d\n",ret);
		int ret = execlp("ls","-al",NULL);
		printf("execl return = %d\n",ret);
		exit(0);
	}
	wait(NULL);
	printf("pid=%d ppid=%d pd=%d\n",getpid(),getppid());
	return 0;
}
下边的是用exec链接的程序

 #include <stdio.h>

int main(int argc, const char *argv[])
{
	hello(argv[0]);
	return 0;
}

int hello( const char *name)
{
	printf("hello %s !\n",name);
	return 0;
}





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值