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};
,您的程序仍然可以运行。
这段代码的重点是模拟一个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};
,您的程序仍然可以运行。