파일과 파일에 연결된 파일 설명자의 차이점

파일과 파일에 연결된 파일 설명자의 차이점

네 줄의 파일이 있습니다.

$ cat file
First line
Second line
Third line
Fourth line
$ 

이 파일을 네 번 읽을 때 항상 첫 번째 줄을 읽었는데, 이는 예상된 결과입니다.

$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$ 

그러나 파일 설명자 3에 연결한 file다음 동일한 방식으로 읽으면 각각의 읽기가 입력 스트림을 "먹습니다".

$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$

파일 설명자가 왜 이렇게 동작합니까?

답변1

다음과 같이 말하면 read var <file명령이 완료된 후 파일 설명자가 닫힙니다. 따라서 다음에 루프를 통과할 때 파일 설명자는 처음으로 재설정됩니다.

이 경우 exec 3<file읽기 read -r -u 3 var명령이 완료되고 읽기 위치가 업데이트되더라도 파일 설명자는 계속 열려 있으므로 다음에 읽기는 다음 줄을 가져옵니다.

참고: 이 작업을 수행하더라도 여전히 비슷하게 작동합니다 exec 0<file.read -r var

답변2

간단한 대답은 이것이 작동하는 방식이라는 것입니다. 파일 설명자에는 읽기 및 쓰기 위치를 포함하는 상태가 포함되어 있습니다. 파일 설명자에 대해 수행된 각 읽기는 이를 읽는 사람에 관계없이 읽기 위치를 이동합니다. 파일 설명자에는 하나의 읽기 위치만 포함됩니다.

즉, 파일 설명자가 운영 체제에 의해 생성될 때 이러한 상태 변수를 포함하는 구조/테이블도 생성됩니다. 테이블에는 읽기 위치의 복사본이 하나만 있으며 파일 설명자에서 read() 함수가 호출될 때마다 단일 읽기 위치 변수가 업데이트됩니다.

관련 정보