stdout과 stderr을 동일한 버퍼로 버퍼링하도록 설정

stdout과 stderr을 동일한 버퍼로 버퍼링하도록 설정

stdoutglibc가 및에 대해 동일한 버퍼를 사용하도록 강제할 수 있습니까 stderr?

두 개의 출력이 나오는 경우 tee:

./tests/tests 2>&1 | tee log

혼합된 메시지가 나타납니다(즉, 메시지는 내부적으로 정렬되지만 stdout서로 stderr간에 정렬되지는 않습니다). 버퍼링을 끌 수 있습니다.

stdbuf -i0 -o0 -e0 ./tests/tests 2>&1 | tee log

그러나 이로 인해 엄청난 속도 저하가 발생합니다(수백MB의 로그를 푸시하고 있습니다). 버퍼링이 가능하지만 stdout와 사이에 공유될 수 있습니까 stderr? FD 12동일한 출력을 가리킵니다(예제에 표시된 대로).

답변1

어떤 경우에 버퍼를 동일하게 만들고 싶은지 잘 모르겠지만 C 프로그램에서 작성자는 라이브러리 함수 계열을 사용하여 버퍼 setbuf()에 동일한 .stderrstdout

setbuf셸을 사용하여 다른 프로그램을 호출하면 됩니다. 함수 계열에서 암시하는 이유( 인스턴스별 메모리(버퍼) 구현 및 보유) 로 인해 이 작업을 수행할 수 없을 것 같습니다 . 프로그램이 특정 방식으로 작성되지 않은 경우, 즉 버퍼가 및 와 동일한 메모리 블록으로 설정되지 않은 경우 쉘은 프로그램이 공통 버퍼링을 수행하도록 할 수 없습니다.FILE *stderrFILE *stdoutstdoutstderr

관련 정보