execve() 中的 Envp 无效

Envp in execve() has no effect

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

1) 从 stdin 请求命令,直到按下 CTRL+D 或输入 "exit" 作为输入。

2) 分叉进程。

3) Parent等待命令被child执行。

4) Child 执行命令。

5) 转到 1

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

我的 nano-shell 中 /bin/env 的输出: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 }  

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

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

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

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

但是请注意,在 POSIX.1."

中未指定主函数的第三个参数的使用

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