Tee がパイプと結合されると、ファイルに書き込まれません。

Tee がパイプと結合されると、ファイルに書き込まれません。

他の人が開発したCコードをMATLABを使用して実行しようとしています。 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''がこれに役立つことを知っていますが、次の2つのコマンドを試してみると、パイプとファイルのサイズは常にゼロです.

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 &'

関連情報