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


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.