【问题标题】:linux dup2 doens't seem to work with pipe?linux dup2 似乎不适用于管道?
【发布时间】:2017-03-04 12:09:27
【问题描述】:

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

#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) 如果是,是否可以将内容自动定向到我的控制台输出?如果不行怎么解决?

【问题讨论】:

    标签: linux redirect input pipe dup2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2023-04-06
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多