【问题标题】:Envp in execve() has no effectexecve() 中的 Envp 无效
【发布时间】:2018-10-10 13:04:10
【问题描述】:

这段代码的重点是模拟一个shell:

1) 从标准输入请求命令,直到按下 CTRL+D 或输入“exit”作为输入。

2) 分叉进程。

3) 父级等待子级执行命令。

4) 孩子执行命令。

5) 转到 1

Execvpe 有效(因为 p 指向 PATH),但除非我输入 /bin/%command%,否则 execve 只会触发 perror()。我究竟做错了什么?感谢您的帮助!

/bin/env 在我的 nano-shell 中的输出:PATH=/bin

  8 #define SIZE 50
  9 #define input fgets(buffer, SIZE, stdin)  
 10 #define exitcheck strcmp(strtok(buffer, "\n"), "exit")
 11 
 12 int main(int argc, char *argv) {
 13   char buffer[SIZE] = "echo";
 14   char* const command[] = {buffer, NULL};
 15   char* const envp[] = {"PATH=/bin", NULL};
 16 
 17   do {
 18     printf("nano-shell $ ");
 19     pid_t pid = fork();
 20     // Parent 
 21     if (pid > 0) {
 22       int status;
 23       waitpid(pid, &status, 0);
 24     } 
 25     // Child
 26     else if (pid == 0) {
 27       execve(command[0], command, envp);
 28       perror("Error: "); 
 29       _exit(1);
 30     } 
 31   } while(input != NULL && exitcheck != 0 );
 32   
 33    exit(EXIT_SUCCESS);
 34 }  

【问题讨论】:

    标签: unix fork exec systems-programming


    【解决方案1】:

    execve() 不会搜索找到可执行文件的路径。也就是说filename(即第一个参数)必须是文件的路径名。

    至于第三个参数envp,一方面,设置路径没有任何区别,因为上面已经提到了。另据the manual page of execve

    "参数向量和环境可以被调用程序的main函数访问,当定义为:

    int main(int argc, char *argv[], char *envp[])

    但是请注意,在 POSIX.1 中没有指定使用 main 函数的第三个参数。”

    也就是说,envp 很可能在 POSIX.1 之后根本不用。例如,只要 filename 是绝对路径,即使您将 envp 设置为 NULL 为:char *envp[] = {NULL};,您的程序应该仍然可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2011-03-04
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多