linux dup2 doens似乎与管道一起工作?

时间:2017-03-04 12:09:28

标签: linux redirect input pipe dup2

我在linux上尝试dup2。我的测试程序是:我打开一个管道,尝试复制stdin到fifo写入,复制stdout到fifo读取,我希望当我运行这个程序时,stdin写入fifo,并且fifo自动将内容转储到stdout:< / p>

#include<stdio.h>
#include<unistd.h>
int main(){
    int pipefd[2];
    pipe(pipefd);
    int& readfd=pipefd[0];
    int& writefd=pipefd[1];
    dup2(STDIN_FILENO,writefd);
    dup2(STDOUT_FILENO,readfd);

    char buf[1024];
    scanf("%s",buf);
    return 0;
}

我运行这个程序,没有看到额外的stdout打印。我的问题:

(1)我的stdin&#34; scanf&#34;被写入fifo writefd?

(2)如果是,可以将内容自动定向到我的控制台输出吗?如果不是如何解决它?

1 个答案:

答案 0 :(得分:1)

如果我man dup2正确,dup2(oldfd, newfd)系统调用会创建一个oldfd文件描述符的副本,编号为newfd,如果以前是newfd,则会静默关闭打开。所以你的dup2(STDIN_FILENO,writefd)行关闭了管道的写端,并用stdin的副本替换它。下一行分别对read end和stdout执行相同操作。因此,您不会通过管道连接stdin和stdout。相反,您创建一个管道,然后关闭它的两端,并用原始stdin和stdout描述符的副本替换它们。之后,scanf("%s",buf);只会像往常一样从原始标准输入读取一个字符串。您可以在此之后添加类似printf("%c\n", buf[1])的行,它会将字符串的第二个字符打印到原始标准输出。请注意,此时,实际上没有使用pipe(pipefd)创建管道 - 它的两端都已关闭。