为什么不能直接用管道输出替换标准输出?

偶来

我想将子进程的输出通过管道传输到父进程的stdout. 我知道还有其他方法可以做到这一点,但为什么不能将管道的读取端复制到stdout为什么程序不打印写到管道写端的内容?

在这里,我有一个关于我正在尝试做的事情的最小示例(没有任何子流程)。我希望test在运行时看到输出,但程序什么都不输出。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    int fds[2];
    if(pipe(fds) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if(write(fds[1], "test", 5) == -1) {
        perror("write");
        exit(EXIT_FAILURE);
    }

    if(dup2(fds[0], STDOUT_FILENO) == -1) {
        perror("dup2");
        exit(EXIT_FAILURE);
    }

    return 0;
}
埃里克·波斯皮希尔

管道是共享缓冲区和一些锁定或控制语义的两个“文件”。当您写入管道时,数据被放入缓冲区。当您从管道中读取数据时,数据是从缓冲区中获取的。

管道中没有任何东西可以将数据移动到某个输出设备。

如果您使用dup2将管道的读取端复制到标准输出文件描述符(编号 1)中,那么您所拥有的只是文件描述符 1 上管道的读取端。这意味着您可以向文件描述符 1 发出读取操作,并且系统将从管道中提供您的程序数据。

在这方面,文件描述符 1 没有什么“特别的”。将任何文件放在文件描述符 1 上不会导致该文件自动发送到任何地方。标准输出的正常工作方式是打开终端或某些选定的输出文件或文件描述符 1 上的其他设备,然后通过写入文件描述符 1 将内容发送到该设备或文件。操作系统不会自动写入内容到文件描述符 1;你必须发出写操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能将汇编器输出通过管道传输到标准输出?

直接输出到管道和标准输出

为什么此“ at”命令不能打印到标准输出?

为什么`>`重定向不能捕获替代进程的标准输出?

为什么不能通过管道多次过滤尾巴的输出?

使用 subprocess.Popen 设置管道:为什么关闭标准输出而不是标准输入?

管道到标准输出

直接压缩标准输出

为什么 perltidy 要进入标准输出?

为什么标准输出错误消息

在* nix系统上管道标准输出/标准错误时,为什么颜色不显示(控制字符)?

批处理脚本:在这种情况下,为什么不能重定向标准输出?

为什么我不能重定向标准输出/错误以登录Linux

为什么我的程序不能正确接受另一个程序的管道输出?

用wc将标准管道输出到文件

为什么这个程序的输出是无序的并写入标准输出?

直接用 gnuplot 绘制其他程序的标准输出

为什么Canny的输出不能保持恒定?

为什么这段代码不能正确输出?

为什么用管道传递$ RANDOM的输出会影响值?

为什么用管道将“ mysql”拖尾到“ tail”会改变输出格式?

我想将“标准”输出流(System.out)链接到PrintWriter流。但是我不能。为什么?

用鱼测试标准输出

如果通过管道输出,为什么cd没有作用?

为什么程序不影响此管道输出?

为什么管道FFMPEG输出与显式文件不同?

如果通过管道输出,为什么要忽略转义序列

为什么将输出写入正在缓冲的管道

为什么sed只对echo的直接输出起作用?