【问题标题】:Understanding the Unix dup2 system call?了解 Unix dup2 系统调用?
【发布时间】:2014-10-20 22:50:15
【问题描述】:

我正在使用dup2() 函数来尝试更好地掌握它。

从手册上看,它需要两个参数。第一个是现有的文件描述符,第二个参数是复制的文件描述符。

我决定尝试将标准输出重定向到管道的写入端。

从手册来看,我认为代码应该是......

 if ((dup2(STDOUT_FILENO, fd[1])) <= 0)
    {
       printf("error on dup \n");
    }

 write(STDOUT_FILENO, "Hi \n", 5);

因为标准输出现在将被复制到 fd[1]。因此,如果我们写到标准输出,我们应该写到写管道结束。但是,这仍然会打印到屏幕上。所以我认为它应该是 fd[1] 后跟标准输出。这是否意味着 stdout 现在是 fd[1] 的副本,这就是它起作用的原因。

最后,如果我想写回屏幕......我将如何在同一过程中执行此操作?

【问题讨论】:

    标签: c unix process pipe


    【解决方案1】:

    dup2的原型是:int dup2(int oldfd, int newfd);

    所以你的应对方式:

    dup2(STDOUT_FILENO, fd[1])
    

    将与 STDOUT_FILENO(通常为 1)关联的 复制到 fd[1] 中的描述符。假设您已将描述符值 4 放入 fd[1],那么最后,1 和 4 都将指向“标准输出流”,通常是终端 tty/pty。

    调用后(如果成功),fd[1] 不再引用管道。听起来您将 dup/dup2 功能与管道混淆了。 pipe() 创建一个具有读写端的描述符对。如果你然后分叉,你可以用管道连接两个进程,然后,一个带有管道的子进程可以将它的管道复制到 STDIN_FILENO 或 STDOUT_FILENO 以便标准库例程将从这些描述符中读/写,认为它们正在读/写到终端。

    唯一使 0, 1, 2 特殊的是它们最初是向终端打开的,并且库例程通过数字(或宏 SDTIN_FILENO 等)引用它们。dup 调用基本上增加了引用计数一个特定的描述符并将底层描述符插槽链接到原始插槽。

    听起来您想要做的是在第一个参数中传递 fd[1],并将其复制到 STDOUT_FILENO 以便将您的管道连接到标准流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 2023-03-18
      • 2011-06-13
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多