execve的“官方”用法解释是:
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。
那么我们来看看下面的代码:
-------------
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main(int argc,char *argv[])
6 {
7 int i;
8 for (i=0;i<argc;i++)
9 {
10 printf("arg%d:%s\n",i,argv[i]);
11 }
12 char **penv=__environ;
13 while(penv&&*penv)
14 {
15 printf("%s\n",*penv++);
16 }
17 return 0;
18 }
19
这个程序的作用是:输出各个命令行参数和系统的环境变量。(把此程序的编译的可执行文件test放在./Extratest/test)
-----------------------------------------------------------------------------------------
那么我们再来看看下面的程序:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/wait.h>
5
6 int main()
7 {
8 pid_t pid;
9 int status;
10 char *arrArg[]={"test","A","B","C",NULL};
11 char *arrEnv[]={"env1=100","env2=yanyb",NULL};
12 pid=vfork();
13 if(pid<0)
14 {
15 printf("vfork error!");
16 exit(1);
17 }
18 if(pid==0)
19 {
20 execve("./Extratest/test",arrArg,arrEnv);
21 }
22 else
23 {
24 if(pid!=wait(&status))
25 {
26 printf("wait error!");
27 exit(1);
28 }
29 }
30 return 0;
31 }
此程序即调用上面的可执行文件,那么他是输出什么呢?
arg0:test
arg1:A
arg2:B
arg3:C
env1=100
env2=yanyb
之所以会这样,就是execve把arrArg的内容作为命令行参数传递给了可执行文件test进程。这样当调用test时,由于test程序的作用之一就是获取命令行的参数并输出(argv[i]的作用),所以原来的命令行参数是./test(所谓的命令行参数可以理解为命令的内容),现在通过传递变成了arrArg的内容;
至于环境变量,由于exceve把新的环境变量传递给了test所在的进程,所以执行完test后自然输出了新的环境变量。
-----------------------------------------------------------------------------
关于argv[]的理解,百度知道有个特别好的解释,这里分享给大家:
argv接收从命令行传来的参数,在程序里可以通过argv[i]来使用。比方你要执行的.exe文件名为test,你在命令行中输入test 2 hello world! 那么在程序里argv[0]就是hello,argv[1]就是world!上面输入的2告诉程序一共有几个命令行参数,用argc表示,就是MAIN()函数的第一个参数。来源:知道用户 KenroJiang 的回答