有没有人可以在检查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;
发布于 2013-03-28 09:06:57
这样做的目的是让stdin (STDIN_FILENO,它是0)指向fd指向的文件(管道的读取端)。首先检查它们是否已经不同...如果是,代码将dup 0到0,然后关闭0 --这不是很好。如果它们不相同,则使用dup2将fd指向的位置设置为STDIN_FILENO。如果dup2成功,它将返回它的第二个参数,因此如果dup2失败,则通过调用exit来进行检查。
你写
据我所知,
fd != STDIN_FILENO将失败
完全不清楚为什么你会“理解”这一点。只有当fd包含STDIN_FILENO (即0)时它才会失败,但它不太可能失败,因为它包含由pipe
调用分配的文件描述符。
dup2仍然会返回STDIN_FILENO以外的内容
如果成功,dup2将返回它的第二个参数。除非失败,否则它不会返回STDIN_FILENO以外的任何东西--为什么它会返回?--在这种情况下,它返回-1。
发布于 2013-03-28 08:58:57
发布于 2013-03-28 09:23:04
对fd[0] != STDIN_FILENO
的检查是一种防御性编程实践,因为通常情况下,标准输入和标准输出以前都是打开的,尽管如果它们在您调用pipe()
之前都已关闭,pipe()
会将这两个描述符分配给管道(请注意,在创建管道时,用于管道两端的文件描述符是编号最小的下一个描述符),因此检查将变得有意义。
https://stackoverflow.com/questions/15677403
复制