개념적으로 스트림은 "문자" 또는 "원자"의 시퀀스입니다. 즉, 이진 스트림은 0과 1의 시퀀스입니다. 그러나 Linux 표준 스트림에서 "읽기"를 요청하는 bash 스크립트를 작성하면 ("ENTER"로 끝나는) 한 줄을 "문자"로 처리한다고 생각하지만 확실하지 않습니다. 이것이 나에게 의미하는 바는 단일 "원자"가 문자열이고 원자가 ENTER로 구분된다는 것입니다. 또한 다른 프로그램에서는 문자열을 입력으로 사용하지 않고 다른 데이터 유형을 사용한다고 가정합니다.
나는 올바른 길을 가고 있습니까? 표준 스트림의 원자/문자는 무엇이며 프로그램은 파일을 원자로 분할하는 방법을 어떻게 알 수 있습니까?
답변1
기본적으로 파이프/파일/소켓 또는 연결하는 모든 stdin/stdout/stderr은 스트림입니다(*)바이트. 관련 시스템 호출은 read()
및 write()
이며 POSIX 설명은 다음과 같습니다.
write() 함수는 buf가 가리키는 버퍼의 nbyte 바이트를 파일 [...]에 쓰려고 시도해야 합니다.
그리고
read() 함수는 열린 파일 설명자 fildes, [...]와 연관된 파일에서 nbyte 바이트를 읽으려고 시도해야 합니다.
반품,POSIX는 바이트를 옥텟과 정확히 동일하게 정의합니다.즉, 8비트가 하나의 단위입니다.
따라서 옥텟은 한 번에 읽거나 쓸 수 있는 가장 작은 단위, 즉 "원자"입니다.
그러나 다양한 유틸리티 회사가 수행하는 작업은 또 다른 문제입니다. read
기본적으로 한 줄을 읽지만 라이브러리 함수도 마찬가지입니다 fgets()
. 셸에 따라 read
Bash와 같이 고정된 수의 바이트만 읽도록 요청할 수 있습니다 .
$ echo foo | ( read -n 1 a; echo "first: $a"; read -n 1 b; echo "second: $b" )
first: f
second: o
그러나 Bash는 read
로캘을 존중하고 개수를 다음과 같이 처리합니다.수치, 멀티바이트일 수 있습니다. 그러나 이것이 우리가 개인적인 책을 읽는 것을 방해하지는 않습니다.바이트대신에:
$ echo äöä | (read -n 1 a; echo "first: $a"; LC_ALL=C read -n 1 b; echo "second: $b" )
first: ä
second: �
(*게다가데이터그램소켓은 여전히 바이트별로 세분화되어 있지만, 소켓 간 경계도 유지합니다.정보(0개 이상의 바이트)가 소켓을 통해 전송되었습니다. 적절하게 설정된 데이터그램 소켓을 stdin/stdout/stderr에 삽입할 수 있지만 이를 수행하는 사람은 거의 없습니다. )