与管道组合时,Tee 不会写入文件

与管道组合时,Tee 不会写入文件

我正在尝试用 matlab 运行由其他人开发的 C 代码。在c中,它被写入stdout,然后在matlab中创建一个管道并读取:

unix('rm -f /tmp/matdata.in;mkfifo /tmp/matdata.in');
unix(['./',file,' > /tmp/matdata.in &']);
fid=fopen('/tmp/matdata.in','r');

现在,我希望将定向到管道的数据也写入文件中以供以后分析。我知道 ''tee'' 对此很有用,但是当我尝试以下两个命令时,管道和文件的大小始终为 0

unix(['./',file,' > /tmp/matdata.in | tee /tmp/data &']);
unix(['./',file,' | tee /tmp/matdata.in /tmp/data &']);

答案1

使用 stdio 写入 stdout 时,文件和管道的输出是块缓冲的。

您需要等到从 stdin 收到 4k 或 8k(取决于您本地的 stdio)并将其写入 stdout。

答案2

问题可能是您将 stdout 定向到带有 的文件> /tmp/matdata.in,这使得tee没有输出可写。重新组织命令' | tee /tmp/data /tmp/matdata.in &'可以解决问题,我可以在我的计算机上使用它来写入两个文件,但我不能完全确定,因为您的底部命令不起作用。也许是与matlab有关。您应该像我的命令一样在末尾使用管道进行尝试。或者,如果 C 代码的编写者没有经常刷新输出,您可以尝试'stdbuf -i0 -o0 -e0 ./',file,' | tee /tmp/data /tmp/matdata.in &'(或)删除可能限制获取数据速率的缓冲'./',file,' | stdbuf -i0 -o0 -e0 tee /tmp/data /tmp/matdata.in &'

相关内容