c - 这个例子如何使用 dup 工作?

标签 c linux pipe dup2 dup

我一直想创建一个 fork 两次以创建两个子进程的子进程。随着一个的输出,发送到另一个。 我找到了这个示例代码。但我对它的工作原理感到困惑。

我找到了一个 example here .但我对 dup 的使用方式及其工作方式感到困惑。

close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);

然后将输出通过管道传输到第二个 fork 进程,它的管道连接如下:

close(0);
dup(fd[0]);
close(fd[0]);
close(fd[1]);

最佳答案

主要相关的行是这些——它们形成了一个标准的习语(但是用 dup2(fd[1], 1) 替换前两行更容易):

close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);

dup() 函数将其参数文件描述符复制到编号最小的未打开文件描述符。 close() 关闭描述符 1,而描述符 0 仍然打开,因此 dup() 使标准输出 1 指的是管道 fd[1] 的写入端。另外两个关闭调用正确地关闭了管道的两端。该进程不应该从管道的读取端读取 fd[0] 并且标准输出正在写入管道的写入端,因此不再需要其他描述符(并且可以如果不关闭会导致问题)。

因此,这是将管道的写入端连接到进程的标准输出的标准序列。第二个序列类似,但将管道的读取端连接到标准输入(而不是将写入端连接到标准输出)。

通常,当您将管道的一端连接到标准输入或标准输出时,该过程应该关闭原始管道的两端

我注意到没有错误检查,尽管不太可能出现任何错误 — 除非进程是在标准输出或标准输入关闭的情况下启动的,这与所有合理的预期相反。

关于c - 这个例子如何使用 dup 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39782928/

相关文章:

c - 标量初始值设定项 c 中的多余元素

haskell 管道 : Understanding the logic of the "for equality"

kubernetes - Gitlab CI管道失败:标记问题

c++ - 如何在特定时间后从 `std::cin` 超时读取

python - 如何移动或调整 X11 窗口的大小(即使它们已最大化)?

python - 子进程中的多个管道

一个对象可以有多个有效类型吗?

c# - 如何重写复杂的 C++ 代码行(嵌套三元运算符)

c - 如果 char[] 位于 struct __attribute__((aligned)) 内部,则 char[] 的步长是否保证为 1?

linux - 脚本中的 LDAP 搜索结果为 "DNS SRV: out of memory"