내가 사용하는 경우:
strace echo 'a
b
c' > file
결론은 다음과 같습니다.
write(1, "a\nb\nc\nd\n", 8) = 8
하지만
strace echo 'a
b
c
d' > /dev/pts/0
이 줄은 다음과 같습니다:
write(1, "a\n", 2) = 2
write(1, "b\n", 2) = 2
write(1, "c\n", 2) = 2
write(1, "d\n", 2) = 2
두 번째 경우는 한 줄씩 작성하고 첫 번째 경우는 함께 작성하는 이유는 무엇입니까? 터미널이 문자 장치이기 때문일 수도 있지만 문자 장치는 다음과 같이 정의됩니다.
문자(char) 장치는 바이트 스트림(예: 파일)으로 액세스할 수 있는 장치입니다. 문자 장치와 일반 파일 간의 유일한 관련 차이점은 일반 파일에서는 항상 앞뒤로 이동할 수 있다는 점입니다. 반면 대부분의 문자 장치는 데이터 채널일 뿐이며 순차적으로만 액세스할 수 있습니다.
편집: 쉘은 bash입니다.
답변1
이것은 매우 간단합니다.
echo
실행 중인 외부 명령은 strace
GNU coreutils의 명령일 가능성이 높습니다. 이는 C 프로그래밍 언어로 작성되었으며 C 런타임 라이브러리 함수(예: putchar()
및 ) 를 사용하여 fputs()
프로그램의 표준 출력에 필요한 내용을 작성합니다.
C 언어에서는 표준 출력으로 출력할 수 있습니다.완전히 버퍼링됨,라인 버퍼, 또는버퍼링되지 않은. 발생하는 규칙은 실제로 C 언어 사양의 일부이며 운영 체제 전체에 적용되며 표준 출력이 "대화형 장치를 참조하지 않도록 결정할 수 있는지" 여부에 대한 추상적인 용어로 작성되었습니다.
isatty()
Unix 및 Linux 운영 체제에서는 파일 설명자가 터미널이 아니라고 나타내는 경우 표준 출력이 완전히 버퍼링되는 방식으로 적용됩니다 . 이 경우에는 이것이 "대화형 장치"입니다. 운영 체제에서 표준 출력은 라인 버퍼링됩니다. C 언어 표준은 후자를 요구하지 않습니다. 이것이 GNU C 라이브러리에 포함된 내용입니다.또한C 언어 표준에 명시된 내용 외에도 C 언어 표준이 수행하는 작업도 문서화되어 있습니다.
따라서 echo
명령의 표준 출력이 터미널이 아니라 파일인 경우 프로그램의 C 라이브러리는 표준 출력에 대한 모든 개별 쓰기를 버퍼링하고 write()
버퍼가 가득 차거나 프로그램이 완료되면 큰 호출을 합니다. 그리고 표준 출력의 경우예터미널, C 라이브러리는 콘텐츠만 버퍼링합니다.출력 개행 문자까지, write()
이때 버퍼의 내용입니다.
따라서 관찰된 시스템 호출이 있습니다.