关于 dup() 用法的困惑

标签 c pipe dup

当我们使用 dup 将 STDOUT 重定向到我们做的管道时:

close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);

但我们正在关闭管道的两端。那么如何将 STDOUT 写入管道?

最佳答案

在示例代码中,您没有关闭管道的两端。您正在关闭 fd[0]fd[1]。最初,关闭它们就足以关闭管道的两端,但在复制 fd[0] 之后就不行了。您还必须关闭重复的 fd 才能关闭对管道的所有引用。但这将是愚蠢的:你正在保持一个端点打开,以便 ls 可以写入。

也许您对 close() 正在关闭感到困惑?它关闭 fd,即对管道一端的引用。它不会关闭管道本身:这就是 shutdown() 会做的事情。 (如果你不调用 shutdown,当每个引用它的 fd 关闭时管道自动关闭。)所以,因为复制的 fd 仍然打开,进程可以写入管道(它没有关闭,因为对它的三个引用中只有两个被关闭)。

关于关于 dup() 用法的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13800606/

相关文章:

Ruby 递归复制/克隆

perl - 从 perl 管道运行 "less"

c - 在 x 宏定义中使用宏作为参数

C: 如何使这个函数线程安全?

C:使用 mknod() 创建命名管道不起作用

linux - Bash shell 脚本,如何在命令中使用管道

c - 尝试从 matlab 调用 dll 函数导致崩溃

c - 区分 XMEGA 中的下降沿和上升沿

linux - ipfw (Dummynet) 无法配置管道的队列大小

ruby - Ruby 中避免滥用赋值 "="的最佳做法是什么?