getdents() 시스템 호출은 내부적으로 어떻게 작동합니까?

getdents() 시스템 호출은 내부적으로 어떻게 작동합니까?

나는 최근 처음부터 나만의 POSIX 운영 체제를 만들기 위해 Linux 소스 코드를 연구하기 시작했습니다. 내가 이해한 바로는 UNIX 계열 시스템의 모든 것은 파일입니다. 바이트를 읽거나 쓸 수 있는 모든 것은 "스트림"으로 추상화될 수 있습니다. 그러나 여기서 나는 인터넷상의 어느 누구도 신경 쓰지 않는 것 같은 질문을 우연히 발견했습니다. (적어도 나는 그것을 설명하는 것을 찾지 못했습니다.) Linux는 모든 것을 파일로 관리하기 위해 뒤에서 정확히 무엇을 수행합니까?

내 질문이 명확하지 않을 수 있으므로 이해하려는 내용의 예는 다음과 같습니다. 셸에 "ls -l"을 입력하면 디스크에 저장된 물리적 파일뿐만 아니라 블록 및 문자 장치도 나열됩니다. , 링크 및 디스크에 저장된 파일이 아닌 기타 항목입니다. 어떻게 작동하나요?

미리 감사드립니다, 데이브.

답변1

POSIX 운영 체제를 처음부터 작성하는 것은 이 사이트의 범위를 훨씬 벗어납니다. 또한 제목과 실제 ​​질문이 일치하지 않습니다.

Linux에서 시스템 호출이 어떻게 작동하는지 궁금하다면 getdents코드를 살펴보세요. 이미 다른 부분에서도 동일한 작업을 수행한 것 같습니다. 하지만 getdents그다지 중요하지는 않습니다. 초기 UNIX 시스템에는 그런 기능이 없었기 때문입니다. 이 getdents기능은 다양한 파일 시스템을 지원하기 위해 도입되었습니다.

실제 질문과 관련하여 ls명령이 파일을 나열하지만 디렉토리 항목을 나열한다는 오해가 있는 것 같습니다. UNIX의 디렉토리 항목은 디렉토리, 명명된 파이프 및 장치뿐만 아니라 파일도 참조할 수 있습니다. 문자 및 블록 장치 항목은 커널의 다양한 드라이버에 대한 인터페이스입니다. 여기에는 드라이버를 식별하는 번호와 동일한 드라이버가 처리하는 다양한 장치를 식별하는 다른 번호가 포함됩니다.

최신 시스템도 파일 시스템 소켓을 지원하지만 전체 소켓 개념은 원래 UNIX 설계의 일부가 아닙니다. 소켓은 파일이 아닙니다. "모든 것이 파일입니다"는 원래 UNIX 디자인을 나타냅니다. 그러나 일단 소켓이 설정되면 파일에도 적용되는 일부 작업을 지원합니다.

소스 코드를 계속 공부할 수 있지만 직접 작성하기 전에 POSIX 시스템에 대해 배우는 것이 좋습니다.

관련 정보