linux下exec函数族

一、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");
	}

}

执行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值