了解Unix dup2系统调用?

时间:2014-10-20 22:50:16

标签: c unix process pipe

我正在玩dup2()功能,试图更好地掌握它。

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

我决定尝试将stdout重定向到管道的写端。

根据手册判断我认为代码应该是......

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

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

因为stdout现在会复制到fd [1]。因此,如果我们写入stdout,我们应该写入写入管道末尾。然而,这仍然打印到屏幕上。所以我认为它应该是fd [1],然后是stdout。那么这是否意味着stdout现在是fd [1]的副本,这就是它工作的原因。

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

1 个答案:

答案 0 :(得分:2)

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

所以你应对:

dup2(STDOUT_FILENO, fd[1])

将与STDOUT_FILENO(通常为1)相关联的 stream 复制到fd [1]中的描述符。假设您已将描述符值4放在fd [1]中,最后,1和4都将指向&#34;标准输出流&#34;这通常是终端tty / pty。

通话结束后(如果成功),fd [1]不再引用管道。听起来你在管道上混淆了dup / dup2功能。 pipe()创建一个具有读写结束的描述符对。如果你然后fork,你可以用管道连接两个进程,然后,带有管道的子进程可以将其管道复制到STDIN_FILENO或STDOUT_FILENO,这样标准库例程将从那些认为他们正在读/写的描述符读/写到终点站。

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

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