linux dup2 似乎不适用于管道?

linux dup2 doens't seem to work with pipe?

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

#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) 我的标准输入 "scanf" 是否被写入 fifo writefd?

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

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