Linux는 열린 파일과 동일한 방식으로 열린 디렉토리를 나타냅니까?

Linux는 열린 파일과 동일한 방식으로 열린 디렉토리를 나타냅니까?

Linux 커널은 열린 파일을 파일 설명자 테이블의 항목, v-node 테이블의 항목 및 열린 파일 테이블의 항목으로 나타냅니다.

Linux 커널은 열린 디렉토리를 같은 방식으로 나타냅니까?

아마도 그렇지 않을 것입니다. 왜 디렉토리가 다음과 같이 열리는지 알고 싶기 때문입니다.

DIR *opendir(const char *pathname);

파일이 열리면:

int open(const char *path, int oflag, ... /* mode_t mode */ );

아마 그럴 거예요. 왜냐면

DIR *fdopendir(int fd);

열린 파일 설명자를 DIR 구조로 변환합니다. 그러면 open()파일처럼 디렉터리를 열고 파일 설명자를 반환할 수 있는 함수( ?)가 있습니까 fd?

opendir()먼저 를 사용하여 open()디렉터리의 파일 설명자를 가져온 다음 fdopendir()파일 설명자 또는 이에 상응하는 항목을 호출하여 달성 됩니까 ?

감사해요.

답변1

opendir콜백 open처럼 내부적으로 시스템 호출을 호출하는 라이브러리 함수입니다 . 파일 스트림에 대한 포인터 를 반환하는 것과 유사하게 디렉터리 스트림에 대한 포인터를 반환합니다 . 원하는 경우 디렉터리에서 직접 시스템 호출을 사용할 수도 있습니다.fopenopenopendirDIRfopenFILEopen

답변2

open()그러면 파일과 같은 디렉터리를 열고 파일 설명자 fd를 반환할 수 있는 함수( ?)가 있습니까 ?

예, 다음 명령을 사용하여 디렉터리를 열 수 있습니다open()파일 설명자를 가져옵니다. .openat()

read()Linux에서는 디렉터리 내에서 액세스 할 수 없지만 , EISDIR("디렉토리입니다")를 반환합니다. 대신 커널에는getdents()열린 디렉터리에서 디렉터리 항목을 읽는 시스템 호출입니다. 혼란스럽게도 오래된 것도 있습니다readdir()동일한 이름의 POSIX 함수와는 다른 시스템 호출(최신 아키텍처에는 없음)

매뉴얼 페이지에 나와 있듯이 getdents()glibc는 이에 대한 래퍼를 제공하지 않으므로 다음을 사용해야 합니다.POSIXreaddir()대신 opendir()기능을 수행합니다. 그렇습니다. 내부적으로 opendir()사용될 때 open()C 라이브러리는 표준 API와 DIR *.

일부 다른 Unix 계열 시스템에서는 read()파일 목록을 가져오기 위해 다른 시스템 호출을 사용하는 대신(또는 추가로?) 디렉터리에서 허용한다는 것을 알고 있습니다.

리눅스open()O_DIRECTORY지정된 파일이 디렉토리가 아닌 경우 열기가 실패하도록 하는 플래그 도 있지만 해당 파일의 사용이 필수는 아닙니다.

관련 정보