exec函数族的综合测试代码

exec函数族用来在程序中执行另外的进程,配合fork函数,用来分别执行不同的进程,在某些场合还是比较实用的。
在这里插入图片描述

下面的测试代码涵盖了exec函数族的所有函数,均给了测试代码和比较详细的解释, 使用函数传参的方式,可以在一个源文件下测试这些函数。

执行 ./exec 1-6即可

测试参考源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

void execl_test(void)
{

/*
    int execl(const char *path, const char *arg, ...);
 		函数描述:加载一个进程,通过路径 + 程序名来加载。
 		函数参数:
 			path:程序路径+程序名字
 			arg:可执行程序的相关参数,使用NULL结尾
 		返回值:
			成功:无返回
			失败:-1
 */
		printf("this is func +++++++++ execl +++++++++\n");
		execl("/home/mint/a.out", "a.out", NULL);
		// 如果执行成功没有返回值
		perror("execl");
		exit(1);
}

void execlp_test(void)
{

/*
    int execlp(const char *file, const char *arg, ...);
		函数描述:加载一个进程,借助PATH环境变量,该函数需要配合PATH环境变量来使用,
						  当PATH中所有目录搜索后没有参数1则出错返回
		函数参数:可执行程序的相关参数,使用NULL结尾
			file:可执行程序的名字
			arg:可执行程序的相关参数,使用NULL结尾
		返回值:
			成功:无返回
			失败:-1
*/
		printf("this is func +++++++++ execlp +++++++++\n");
		execlp("ls", "ls", "-la", NULL);
		// 如果执行成功没有返回值
		perror("execlp");
		exit(1);
}


void execvp_test(void)
{

/*
    int execvp(const char *file, char *const argv[]);
		用法同 execlp
 */
		printf("this is func +++++++++ execvp +++++++++\n");
		char* arg[] = {"ls", "-a", "-l", NULL};
		execvp("ls", arg);
		// 如果执行成功没有返回值
		perror("execvp");
		exit(1);
}

void execle_test(void)
{

/*
    int execle(const char *path, const char *arg, ..., char *const envp[]);
    	 	从用户指定的目录中搜索指定的命令
 */
		printf("this is func +++++++++ execle +++++++++\n");
		char* env[] = {"/bin", "./", "/home/mint", NULL};	// 自己指定环境变量,对应PATH
		execle("/bin/ls", "ls", "-l", "-a", NULL, env);
		// 如果执行成功没有返回值
		perror("execle");
		exit(1);
}


void execv_test(void)
{

/*
    int execv(const char *path, char *const argv[]);
    	用法同:execl
 */
		printf("this is func +++++++++ execve +++++++++\n");
		char* argv[] = {"a.out", NULL};
		execv("/home/mint/a.out", argv);
		// 如果执行成功没有返回值
		perror("execv");
		exit(1);
}


void execve_test(void)
{
/*
    int execve(const char *path, char *const argv[], char *const envp[]);
 */
		printf("this is func +++++++++ execve +++++++++\n");
		char* argv[] = {"ps", "a", "u", "x", NULL};
		char* env[] = {"/bin", "/home/", "./", NULL};
		execve("/bin/ps", argv, env);
		// 如果执行成功没有返回值
		perror("execve");
		exit(1);
}

int main(int argc, const char *argv[])
{
    
	pid_t pid;
    int exec_num;
    
	if(argc<2)
	{
		printf("usage %s 1-6 to exec test\n", argv[0]);
		return -1;
	}
    
	exec_num = atoi(argv[1]);
    
	pid = fork();
	if(pid == -1)
	{
		perror("fork");
		exit(1);
	}
    
// 子进程执行另外一个程序
	if(pid == 0)
	{
    	switch(exec_num)
    	{
    		case 1:
    			execl_test();
    			break;
    		case 2:
    			execlp_test();
    			break;
    		case 3:
    			execvp_test();
    			break;
    		case 4:
    			execle_test();
    			break;
    		case 5:
    			execv_test();
    			break;
    		case 6:
    			execve_test();
    			break;
    		default:
    			break;
    	}
	}
	else if(pid > 0)
	{
		printf("parent process +++++++++++++++++++\n");
	}

	printf("*****************************\n");

	return 0;
}

测试结果:

./exec_full 1

在这里插入图片描述

./exec_full 2

在这里插入图片描述

./exec_full 3

在这里插入图片描述

./exec_full 4

在这里插入图片描述

./exec_full 5

在这里插入图片描述

./exec_full 6

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值