2017-03-04 103 views
0

我正在尝试在Linux上的dup2。我的测试程序是:我打开一个管道,尝试复制stdin到fifo写入,dup stdout到fifo读取,我希望当我运行这个程序时,stdin被写入fifo,并且fifo自动将内容转储到标准输出:linux dup2 doens似乎与管道工作?

#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; 
} 

我运行这个程序,没有看到额外的标准输出。我的问题:

(1)我的stdin“scanf”被写入fifo writefd吗?

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

回答

1

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