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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个开源的内存数据结构存储系统,它使用C语言编写。在Redis的源代码中,execve函数主要用于执行外部程序。 在Redis源代码中,execve函数被用在了AOF(Append-Only File)持久化机制的实现中。AOF持久化机制会将Redis服务器接收到的每个写命令都追加到一个AOF文件中,以便在Redis服务器重新启动时重放这些命令来恢复数据。当Redis需要将AOF文件转换为内存数据库时,它会调用execve函数来执行外部程序。 以下是Redis源代码中execve函数的一个例子: ```c static int rewriteAppendOnlyFileBackground(void) { pid_t childpid; long long start; if (server.aof_child_pid != -1) return C_ERR; /* Rewrite already in progress */ server.stat_rewriting_aof = 1; server.aof_rewrite_time_start = start = ustime(); if ((childpid = fork()) == 0) { char tmpfile[256]; /* Child */ closeListeningSockets(0); if (server.ipfd > 0) close(server.ipfd); if (server.tlsfd > 0) close(server.tlsfd); server.ipfd = server.tlsfd = -1; snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid()); openChildInfoPipe(); if (rewriteAppendOnlyFile(tmpfile) == C_OK) { if (rename(tmpfile,server.aof_filename) == -1) { serverLog(LL_WARNING,"Can't rename %s as %s: %s", tmpfile, server.aof_filename, strerror(errno)); exit(1); } exitFromChild(0); } else { exitFromChild(1); } } else { /* Parent */ if (childpid == -1) { serverLog(LL_WARNING,"Can't rewrite append only file in background: fork: %s", strerror(errno)); return C_ERR; } serverLog(LL_NOTICE,"Background append only file rewriting started by pid %d",childpid); server.aof_child_pid = childpid; updateDictResizePolicy(); return C_OK; } } ``` 在上述代码中,当Redis需要将AOF文件转换为内存数据库时,它会调用rewriteAppendOnlyFileBackground函数来启动一个子进程来执行AOF文件转换。在子进程中,它会调用rewriteAppendOnlyFile函数来执行AOF文件转换,并将结果写入一个临时文件中。如果AOF文件转换成功,它会调用rename函数将临时文件重命名为正式的AOF文件;否则,它会退出子进程。 在子进程中,openChildInfoPipe函数用于打开一个管道,用于将子进程的状态信息传递给父进程。如果子进程需要向父进程报告状态信息,它会调用sendChildInfo函数将信息发送到管道中。在父进程中,updateDictResizePolicy函数会更新字典的大小调整策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值