我正在尝试用 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 &'