추가 읽기

추가 읽기

Ubuntu 20, Bash 5.

제가 뭔가 멍청한 걸 간과했을 수도 있어요! 로깅을 위해 및 를 foo사용하는 C++ 바이너리가 있습니다 .std::coutprintf()puts()

./foo터미널에서 실행하면 일부 출력(및 분할 오류)이 발생합니다.

모든 것을 리디렉션하면 ./foo > log출력의 일부만 표시됩니다. 예상 ./foo 1>one 2>two대로 then 을 전파하면 one단축된 출력이 포함되고 two아무것도 포함되지 않습니다.

(분명히) 중앙 로깅 기능이 없으므로 강제로 새로 고치는 방법을 상상할 수 없습니다.

무엇이 잘못될 수 있나요?


$./foo
text1
text2

$./foo > log ; cat log
text1

답변1

로깅은 이와 아무 관련이 없으며 배워야 할 C 및 C++ 프로그래밍의 기본 측면입니다.

표준 I/O 라이브러리 루틴은 런타임 라이브러리가 표준 출력이 터미널 장치가 아니라고 결정했기 때문에 출력을 완전히 버퍼링합니다. stdout 라인 버퍼링을 원하는 경우 setvbuf()stdout이 Bernstein과 같은 도구를 사용하는 터미널임을 C 런타임 라이브러리에 확신시키 ptybandage거나 C 라이브러리의 특수 후크를 사용하여 코드를 사용하여 라인 버퍼링을 켜는 방식으로 코드에서 라인 버퍼링을 켤 수 있습니다. 주입 도구, 예를 들어 여기서는 아마도 가장 좋은 옵션 stdbuff일 것입니다 . ptybandage비침습적이며 아마도 할 수 있습니다아니요표준 I/O 버퍼링의 특성을 제대로 이해하고 나면 프로그램에서 명시적인 버퍼 재정의를 구현하고 싶을 것입니다.

그런데 표준 출력에는 기록하지 마세요. 에 로그인하세요 std::clog.

추가 읽기

관련 정보