exec族库函数的学习

一、 main函数要传的参数

通过这节课的学习才知道,其实main函数不仅可以穿argc和argv,还有一个环境参数env可以传进去。

代码就像这样子

#include <stdio.h>


int main (int argc, char *argv[],char *env[])// 这里可以改成char **argv和 char **env
{
	int i = 0; //设置一个初始值,用于对应每一项环境参数,我试过从-1开始就直接NULL了,所以要从0开始
	while(NULL != env[i]) //while循环,直到所有env parameter都被输出后再结束循环
	{
		printf("env[%d] = %s\n",i,env[i]);
		i++;
	}
	return 0;
}

二、 进入正题,exec族函数

包含有execl、execlp、execle、execv、execvp、execvpe。

1.execl和execv

 int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */);
 int execv(const char *path, char *const argv[]);

两者前面的第一部分都是传入路径地址,是char*类型的,所以要加上双引号"",紧接着传入第一个arg,第二个arg,最后传完了的话最后是NULL不能漏。

代码

else if (0 == ret)
		{
			printf("子进程\n");
			int ret_exec = 0;
			//ret_exec = execl("hi2","argv[0]",argv[1],argv[2],NULL); //execl的用法
			char *const aaa[] = {"argv[0]",argv[1],argv[2],NULL}; //execv的用法
			ret_exec = execv("hi2",aaa); 
			if (-1 == ret_exec)
			{
				perror("execl");
			}
		
		}

结果
在这里插入图片描述

注意

1.代码块是子程序的代码块
2.如果需要运行的东西是当前路径的话可以直接文件名即可,()我编译了一个可执行文
件叫hi2),或者全路径也行/mnt/hgfs/vmsd/APPNet/process/hi2
hi2的作用是printf argc对应的argv。
3.可以看到,不管是execl还是execv,都是从argv[1]开始用的,argv[0]对他没影响,但是少了又不行,会缺,我还特地把argv[0]打了出来。

总结

这一段就实现了在子程序里面,利用execl或者execv来执行其他可执行文件。

2.execlp和execvp

哈,跟上面的exel和execv很像,没错,就是多了一个p。
两者的话呢,在原型上也是类似的,

 int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);
 int execvp(const char *file, char *const argv[]);

execl和execv的话,传进去的一个参数是path,是要全路径的,但是这里的话是file。
刚刚验证了课程所说的结论了,file包含有path 的功能,第一个参数传进去全路径没问题,但是如果找不到的话会自动跑到/bin/目录下找相对应的文件。

			#if 1
			/********execlp和execvp的使用****************/
			/*多了个p,原型path换成了file,file包括path的功能,找不到就去/bin目录下找*/
			int ret_exec = 0;
			//ret_exec = execlp("hi3","argv[0]",argv[1],argv[2],NULL); 
			char *const aaa[] = {"argv[0]",argv[1],argv[2],NULL};
			ret_exec = execvp("hi4",aaa); 
			if (-1 == ret_exec)
			{
				perror("execlp");
			}
			/********execlp和execvp的使用****************/
			#endif

就像这个样子,我把hi3放在了/bin目录底下,这时候当前文件夹没hi3的,所以运行的时候它会找不到,然后去/bin/目录底下找。如果把名字改成hi4的话就会报错了,就像酱紫。
在这里插入图片描述

扫描二维码关注公众号,回复: 10605309 查看本文章
发布了38 篇原创文章 · 获赞 1 · 访问量 1037

猜你喜欢

转载自blog.csdn.net/qq_40897531/article/details/104025856
今日推荐