execve的用法举例

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   的回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值