有人可以在检查 fd[0] != STDIN_FILENO
后解释使用 dup2
的原因吗,因为据我了解 fd[0] ! = STDIN_FILENO
会失败并且 dup2
仍会返回 STDIN_FILENO
以外的内容,只是想了解一些示例代码谢谢,如果有人可以解释使用execlp 对我来说太棒了。
int fd[2];
pid_t pid;
if(argc != 2) {
fprintf(stderr, "Must be specify exactly 1 file\n");
exit(0);
}
if(pipe(fd) < 0)
exit(1);./
pid = fork();
switch (pid) {
case -1:
exit(1);
case 0:
close(fd[1]);
//here
if(fd[0] != STDIN_FILENO) {
if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
exit(3);
close(fd[0]);
}
if(execlp("tr", "tr", "[a-z]", "[A-Z]", (char *) 0) < 0)
exit(4);
break;
default:
close(fd[0]);
// and here
if(fd[1] != STDIN_FILENO) {
if(dup2(fd[1], STDIN_FILENO) != STDIN_FILENO)
exit(5);
close(fd[1]);
}
if(execlp("cat", "cat", argv[1], (char *) 0) < 0)
exit(4);
break;
}
return 0;
最佳答案
目的是让stdin(STDIN_FILENO,为0)指向fd[0]指向的文件(管道的读取端)。首先检查它们是否已经相同……如果是,代码会将 0 复制为 0,然后关闭 0——不好。如果它们不相同,请使用 dup2 使 STDIN_FILENO 指向 fd[0] 指向的位置。如果 dup2 成功,它会返回它的第二个参数,因此如果 dup2 失败,则通过调用退出进行检查。
你写
From what I understand fd[0] != STDIN_FILENO would fail
完全不清楚您为什么“理解”这一点。它仅在 fd[0] 包含 STDIN_FILENO(即 0)时失败,但不太可能,因为它包含由 pipe
调用分配的文件描述符。
dup2 would still return something other than STDIN_FILENO
dup2 如果成功则返回它的第二个参数。它不会返回 STDIN_FILENO 以外的东西,除非它失败了——为什么会这样呢? -- 在这种情况下它返回 -1。
关于c - Fd[0] 之后的 dup2!= STDIN_FILENO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677403/