디렉토리는 언제 파일로 읽히지 않습니까?

디렉토리는 언제 파일로 읽히지 않습니까?

나는 "유닉스 프로그래밍 환경"이라는 책의 초판을 가지고 있습니다. 2장에서 저자는 디렉토리를 파일로 읽을 수 있다고 말하고 이러한 파일 형식에 대한 몇 가지 사실을 언급합니다. 예를 들어 cat .연습 2-2에서 몇 가지 사용 예를 제공합니다 .

적어도 다윈에서는 디렉토리가 더 이상 파일만큼 읽기 어렵습니다. 적어도 읽을 때 길이가 0인 파일로 나타납니다.

언제 이런 변화가 일어났나요? 관련 공식 문서가 있나요?

답변1

최신 POSIX 사양(POSIX.1-2008)의 오류 번호 참조에는 다음과 같은 내용이 나와 있습니다.

[에이스디르]

디렉토리입니다. 지정된 쓰기 모드로 디렉터리를 열려고 시도합니다.

이는 POSIX 호환 운영 체제에서 디렉터리가 읽기 전용 모드(O_RDONLY)로 열린 경우 해당 디렉터리를 읽을 수 있어야 함을 의미합니다.

방금 NetBSD(POSIX에 관심이 있는) 머신에서 이것을 시도했는데 예상대로 작동했지만 EISDIR을 사용하는 GNU/Linux에서는 실패했습니다(이런 일이 일어나서는 안 됩니다).

Linux를 잠깐 살펴보면 이것이 의도적인 것임을 알 수 있습니다(http://lxr.free-electrons.com/source/fs/libfs.c#L189):

ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
        return -EISDIR;
}

특정 파일 시스템 구현이 이를 재정의할 수 있지만(Ceph와 마찬가지로:http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142), 기본 동작은 디렉토리가 읽기 전용으로 열려 있더라도 누군가가 디렉토리를 읽으려고()하려고 할 때마다 EISDIR을 반환하는 것입니다.

이 변경 사항을 2.0.x로 추적해 보니 적어도 ext2 파일 시스템에서는 여전히 그렇습니다.

그렇습니다. POSIX 호환 운영 체제에서는 디렉토리를 읽을 수 있어야 하지만 일부 커널(예: Linux 및 기타 커널)은 이 조건을 무시하고 표준을 위반합니다.

관련 정보