一、 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 查看本文章