디렉토리는 언제 파일로 읽을 수 없었습니까?


29

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

최소한 다윈에서는 디렉토리를 더 이상 파일로 읽을 수 없습니다. 최소한 읽을 때 길이가 0 인 파일 인 것 같습니다.

이 변경은 언제 발생했으며 공식적인 문서가 있습니까?


1
나는 1991 년 9 월 -1995 년 태양 태양계에서 일한 것을 기억합니다. 나는 그 기간 어딘가에 나를 위해 일을 중단했다고 생각합니다. 우리가 시스템 V를 가진 sparc 머신으로 업그레이드했을 때 (잘 기억하지 못합니다). 파일 시스템에 따라 다를 수 있습니다. 파일 시스템이 설명 된대로 정확하게 데이터를 저장하지 않으면 호환성 계층을 추가하지 않으면 데이터가 손상됩니다. 또한 Debian Gnu + Linux를 사용하여 오늘 작동하지 않습니다.
ctrl-alt-delor

1
필자는 디렉토리를 파일로 읽는 것이 80 년대 후반-90 년대 초에 Unix System V에서 작동한다는 것을 알고 있습니다. SunOS에서 작동했습니다. 일부 버전의 Irix에서 작동했습니다. 가상 파일 시스템을 사용하고 많은 기본 디스크 조직을 허용하면 실제로이를 효율적으로 지원할 수 없다고 생각합니다.
Bruce Ediger

8
더 많은 (비공식적) 정보는 여기에서 찾을 수 있습니다 : utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh

나는 AIX와 Solaris를 확인했다. 실제로 AIX에서는 여전히 cat .Linux에서와 같이 Solaris 11에서는 할 수 없다. 시원한.
gena2x

답변:


13

최신 POSIX 사양 (POSIX.1-2008)의 오류 번호 참조는 다음과 같습니다.

[EISDIR]

디렉토리입니다. 쓰기 모드가 지정된 디렉토리를 열려고했습니다.

즉, POSIX 호환 OS에서는 디렉토리를 읽기 전용 (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 호환 OS에서는 디렉토리를 읽을 수 있어야하지만 일부 커널 (예 : Linux 및 기타 커널)은이 조건을 무시하고 표준을 위반합니다.


6
Open Group에 따르면 Linux의 동작 은 표준 XSI 확장에서 합법적 입니다. readdir(2)더 휴대하기 편리합니다. 그것은 OP의 질문에 대한 정답이 "XSI가 대중화되었을 때"라고 제안합니다.
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.