我在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)如果是,可以将内容自动定向到我的控制台输出吗?如果不是如何解决它?
答案 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)
创建管道 - 它的两端都已关闭。