
스크립트/파일의 끝을 어떻게 결정했는지 궁금합니다. 나는 특히 오래된 Unix 버전(예: V6)에 관심이 있습니다.
마지막으로 쓴 문자 뒤에 '\0'이 있습니까?
답변1
이전 Unix의 Userland 프로그램에서는 파일 끝에 "pad" 바이트가 표시되지 않았습니다. 나는 MS-DOS나 CP/M이 디스크 블록을 Ctrl-Z 문자로 채울 것이라는 것을 알고 있으므로 파일 읽기 알고리즘은 디스크 블록 끝을 확인해야 할 뿐만 아니라 패딩 바이트도 확인해야 했습니다.
유닉스는 그런 일을 한 적이 없습니다. 프로그램은 파일 끝 조건이 발생할 때까지 바이트를 읽습니다. 이는 시스템 read(2)
호출의 경우 0을 반환함을 의미합니다. 불행하게도 장기 실행 시스템 호출이 중단되어 read()
오류 코드(-1)가 반환될 수 있으며 전역 기호는 다음을 errno
평가합니다. EINTR에 추가하므로 Unix는 전통적으로 특정 장치를 읽는 데 약간의 멍청함을 도입합니다.
이 모든 것에는 파일 시스템 측면도 있습니다. Unix 파일 시스템은 데이터를 디스크 블록에 저장하고 inode에 파일 크기(바이트) 값을 유지합니다. 일부 다른 OS에서는 파일 크기를 블록 단위로만 유지했습니다. 데이터가 블록보다 작은 경우 문제는 패드 바이트 또는 기타 말도 안되는 문제로 사용자 영역으로 퍼집니다.
답변2
반드시 그런 것은 아닙니다. 쉘 인터프리터는 일부(다소 복잡한) syscall 래퍼(예 read()
: fread()
)를 사용하여 스크립트로 파일을 읽고 파일의 마지막 바이트에 도달하면 파일 끝 조건을 알립니다(필요하지 않음). 0이 됩니다).