`cat`의 I/O 모델은 다른 유틸리티와 어떻게 다릅니까?

`cat`의 I/O 모델은 다른 유틸리티와 어떻게 다릅니까?

stdbuf --help(GNU)의 출력에서:

Usage: stdbuf OPTION... COMMAND
Run COMMAND, with modified buffering operations for its standard streams.
...

NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does
for example) then that will override corresponding changes by 'stdbuf'.
Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O,
and are thus unaffected by 'stdbuf' settings.

이 맥락에서 "I/O 스트림"의 정확한 정의가 무엇인지, 그리고 그것이 정확히 어떻게 적용되는지 cat혼란스럽습니다 . 표준 I/O 스트림을 사용하지 않는 경우 무엇을 사용합니까? 관련 매뉴얼 페이지와 웹 검색에서는 추가 통찰력을 제공하지 못했습니다.

답변1

dd그리고 버퍼링된 C stdio 함수( , , , ) 대신 및 시스템 호출을 직접 cat사용하므로 stdio에 대한 변경 사항이 영향을 미치지 않습니다.read(2)write(2)fread(3)fwrite(3)printf(3)

stdbuf(1)기본적으로 프로그램에서 사용하는 버퍼링 전략이 아닌 사용자가 요구하는 버퍼링 전략을 사용하기 위해 stdio의 일부 기능을 재정의하는 작은 동적 라이브러리(Mac LD_PRELOAD또는 에서 사용)를 미리 로드하여 작동합니다.DYLD_INSERT_LIBRARIES

답변2

stdbuf수동좀 더 명확하게 말하면:

주문하다프로그램 이름으로 시작해야 합니다.

  1. 입력/출력에 ISO C FILE스트림을 사용합니다(프로그램을 참고하세요 dd. cat이렇게 하지 마세요).
  2. 표준 스트림의 버퍼링을 조정하지 않습니다(이 프로그램은 tee이 범주에 속하지 않습니다).

ISO C FILE스트림은 다음에서 반환된 것과 같은 스트림입니다.fopen, 상대적open. 표준 입력, 출력 및/또는 오류를 중심으로 C 라이브러리의 래핑된 스트림을 조정하는 라이브러리를 stdbuf미리 로드하여 작동합니다 . 이러한 스트림을 사용하지 않는 프로그램은 영향을 받지 않습니다. 예를 들어 GNU는libstdbufFILEcat표준 입력 파일 설명자 또는 다음에 의해 반환된 파일 설명자open.

관련 정보