C++ Linux复制缓冲区?

C++ Linux复制缓冲区?,c++,c,linux,debian,buffer,C++,C,Linux,Debian,Buffer,现在,我的设置如下所示: command1 | buffer | command2 我想让第三个命令“command3”也从缓冲区中读取。我尝试的解决方法是将进程作为子进程启动,并简单地通过管道传输command1 | buffer | command3。问题是,它不仅会导致command1的读取错误,command2还会从command3或其他方面“窃取”数据。基本上,我想要实现的是类似于tee的行为,但不是将其转发到一个缓冲区和一个文件,而是将其转发到两个缓冲区,而不让command2影响c

现在,我的设置如下所示:

command1 | buffer | command2

我想让第三个命令“command3”也从缓冲区中读取。我尝试的解决方法是将进程作为子进程启动,并简单地通过管道传输command1 | buffer | command3。问题是,它不仅会导致command1的读取错误,command2还会从command3或其他方面“窃取”数据。基本上,我想要实现的是类似于
tee
的行为,但不是将其转发到一个缓冲区和一个文件,而是将其转发到两个缓冲区,而不让command2影响command3,反之亦然。有点像这样:

command1 | buffer1 | command2 \ ---- buffer2 | command3 命令1 |缓冲区1 |命令2 \ ----缓冲区2 |命令3 它也应该同时发生。
我怎样才能做到这种行为?有代码或非代码解决方案吗

编辑:我正在处理无限流即音频。

您可以在bash上执行类似操作

echo hello | tee>(echo command1>&2)| echo command2


使用
tee
和bash的命令替换:

命令示例:

$alias command1='perl-e'\'''$|=1;核心::表示qw(a b c)“'
$alias command2='perl-pe'\''$\124;=1;$\u=“x$\”\'
$alias command3='perl-pe'\''$\124;=1;$\u=“y$\”\'
解决方案:

$exec 3>&1#dup2(1,3)
$command1 | tee>(command2>&3)| command3
x a
y a
x b
y b
xC
y c
$exec 3>和-#关闭(3)
(与同时发布的另一个答案不同,这个答案并不假定STDOUT和STDERR是相同的。)

(这些行似乎是由
command2
command3
以锁步方式处理的,如果没有额外的通信,这是无法保证的。为了更接近,
command1
需要避免缓冲其输出。)

如果您希望一个程序执行此操作而不是使用shell,那么只需大致详细地执行以下操作即可:

  • 对于
    2
    3
    中的
    i
  • 创建管道
    pipei
  • 叉子
  • 如果在孩子身上,
  • 关闭
    管道i的写入端
  • 将管道I的读取端连接到fd 1
  • 执行
    命令i
  • 关闭
    管道i的读取端
  • pipei
    写入端的close-on-exec标志设置为true
  • 写入两个管道

  • 有一个单独的进程(如
    tee
    )从一个管道读取数据,然后写入两个或多个其他管道?读取“擦除”数据是否不可能写入两个管道?这就是我对阅读作品的理解。解决方案是将缓冲区暂时保存在某个地方,但我不知道在代码中会是什么样子。建议读者使用输入管道,然后将数据复制到两个输出管道。在伪代码中,
    while(more){read(input,buffer);write(output1,buffer);write(output2,buffer);}
    在我的第一个问题中,我忘了提到我使用无限流作为输入,command2和command3也需要同时接收数据。同样的逻辑是否仍然适用?这是一个bash解决方案,但OP询问的是C/C++问题,我忘了提到我使用的输入是无限的,我需要同时处理缓冲区。从您的示例来看,似乎命令2在命令3之前得到处理。“无限”流工作正常。而
    command2
    command3
    同时(或尽可能接近)获得输入。缓冲会导致数据分块发送,您可以禁用该功能。如果你想让这些行在锁步中处理,它们需要相互通信或与
    command1
    通信。这是一个bash解决方案,但是OP询问的是关于C/C++的问题。你链接到我的答案帮了我很多忙。我不知道moreutils包裹里的“小便”。这正是我想要的。谢谢。很高兴能帮上忙。