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''가 이에 유용하다는 것을 알고 있지만 다음 두 명령을 시도하면 파이프와 파일의 크기가 항상 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 &'

관련 정보