Kiedy katalogi przestały być czytelne jako pliki?

29

Mam pierwszą edycję książki The Unix Programming Environment. W rozdziale 2 autorzy stwierdzają, że katalogi są czytelne jako pliki, i wspominają kilka faktów na temat formatu tych plików. Podają przykłady użycia, takie jak cat .(w ćwiczeniu 2-2).

Przynajmniej w Darwin katalogi nie są już czytelne jako pliki. Przynajmniej wydają się być plikami o zerowej długości podczas odczytu.

Kiedy ta zmiana nastąpiła i czy jest na to oficjalna dokumentacja?

Tyler
źródło
1
Pamiętam, że działał jakiś czas 1991sep-1995jun na słonecznych promieniach słońca. Wydaje mi się, że również w tym okresie przestało mi to działać. Po aktualizacji do sparc maszyn z systemem V. (nie pamiętam dobrze). Prawdopodobnie zależy to od systemu plików. Jeśli system plików nie przechowuje danych dokładnie tak, jak opisano, ulegnie awarii, chyba że zostanie dodana warstwa zgodności. Również dzisiaj nie działa przy użyciu Debian Gnu + Linux.
ctrl-alt-delor
1
Wiem, że czytanie katalogu jako pliku działało pod Unix System V pod koniec lat 80. - na początku lat 90. Działa pod SunOS. Działa pod niektórymi wersjami Irixa. Myślę, że przejście do wirtualnego systemu plików i umożliwienie wielu bazowym organizacjom dyskowym oznacza, że ​​tak naprawdę nie można tak skutecznie wspierać.
Bruce Ediger,
8
Więcej (nieautorytatywnych) informacji można znaleźć tutaj: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Sprawdziłem cat .w systemach AIX i Solaris - w rzeczywistości w systemie AIX można nadal korzystać z systemu Solaris 11 (podobnie jak w systemie Linux). Fajne.
gena2x

Odpowiedzi:

13

Odwołanie do numeru błędu z najnowszej specyfikacji POSIX (POSIX.1-2008) stwierdza:

[EISDIR]

Jest katalogiem. Podjęto próbę otwarcia katalogu z określonym trybem zapisu.

Oznacza to, że w systemie operacyjnym zgodnym z POSIX powinieneś mieć możliwość odczytu () katalogu, jeśli otworzysz go tylko do odczytu (O_RDONLY).

Właśnie próbowałem tego na komputerze NetBSD (który naprawdę dba o POSIX) i działa zgodnie z oczekiwaniami, podczas gdy nie działa na GNU / Linux z EISDIR (co nie powinno się zdarzyć).

Szybkie spojrzenie na Linuksa pokazuje, że jest to zamierzone ( 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;
}

Chociaż konkretna implementacja systemu plików może go zastąpić (podobnie jak CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), domyślnym zachowaniem jest zwracanie EISDIR za każdym razem, gdy ktoś próbuje read () katalog, nawet jeśli jest otwarty tylko do odczytu.

Prześledziłem tę zmianę z powrotem do wersji 2.0.x, a przynajmniej dla systemu plików ext2 nadal tak było.

Tak, tak, w systemie operacyjnym zgodnym z POSIX powinieneś być w stanie odczytać katalog, ale niektóre jądra (jak Linux i, najwyraźniej inne) po prostu ignorują ten warunek i łamią standard.

Sergio L. Pascual
źródło
6
Według Open Group zachowanie Linuksa jest tutaj legalne na podstawie rozszerzenia XSI do standardu . readdir(2)jest bardziej przenośny. To sugeruje mi prawidłową odpowiedź na pytanie OP: „Kiedy XSI stał się popularny”.
Kevin