Właśnie spotkałem następujące pytanie w Unix Programming Environment , klasycznej książce Kernighana i Pike'a na temat Uniksa (znalazłem poniższy tekst na s. 79 wydania z 1984 roku, ISBN: 0-13-937699-2):
Ćwiczenie 3-6. (Podchwytliwe pytanie) Jak uzyskać / w nazwie pliku (tzn., Że / nie rozdziela składników ścieżki?
Pracuję z Linuksem od lat, zarówno jako użytkownik końcowy, jak i programista, ale nie mogę odpowiedzieć na to pytanie. Nie ma sposobu na umieszczanie ukośników w nazwach plików, jest to absolutnie zabronione przez jądro. Możesz załatać system plików poprzez dostęp do urządzenia blokowego lub użyć podobnie wyglądających znaków z Unicode, ale to nie są rozwiązania.
Rozumiem, że Linux ≠ Unix, ale ta sama zasada powinna mieć zastosowanie, ponieważ system musi być w stanie jednoznacznie wyodrębnić hierarchię katalogów ze ścieżek.
Czy ktoś wie, o czym dokładnie myśleli Kernighan i Pike, zadając te pytania? Jaka była rzekoma odpowiedź? Czym dokładnie jest „sztuczka”? A może oryginalny system uniksowy może po prostu uciec przed tym cięciem?
UPD:
Skontaktowałem się z Brianem Kernighanem w sprawie pytania i on odpowiedział:
Odpowiedź brzmi (lub była) „Nie możesz”.
Dlatego Timothy Martin miał rację i dostał zielonego tik.
źródło
a
i zmusić swój system do myślenia, że system plików znajduje się w ustawieniach regionalnych EBCDIC? ASCIIa
to 0x61, co odpowiada/
w EBCDIC (strona kodowa 37)Odpowiedzi:
Być może odpowiedź jest taka sama jak część odpowiedzi w tym podstępnym pytaniu:
Jak schodzisz ze słonia? Ty nie. Dostajesz go od gęsi.
Z „The Practice of Programming” Briana W. Kernighana i Roba Pike'a, Ch. 6, str. 158:
źródło
Zrobiłem to. Było to w systemie UNIX działającym na PDP-11 około 1980 roku. Utworzyłem plik o nazwie „WhatXNow?”. Następnie użyłem „edytora” pliku binarnego do edycji urządzenia dyskowego i zmiany „X” na „/” w i-węzle (z odmontowanym systemem plików).
Ofiara nigdy nie wymyśliła, jak ją usunąć.
Edycja: ups, Barmar ma rację, nie widziałem tam linii o nie łataniu urządzenia. I tak, to był katalog, który edytowałem, a nie i-węzeł. Minęło trochę czasu :-)
źródło
fsck
, że usunąłbym to.Każdy scenariusz, w którym
/
(a dokładniej bajt - nie znak - o wartości 0x2f; prawie wszystkie jądra uniksowe są celowo nieświadome kodowania znaków) trafia do pozycji katalogu, bez ręcznego manipulowania surowymi blokami dysku, jest niewątpliwie błąd w jądrze.Takie błędy zdarzają się od czasu do czasu. Jednym z przypadków, dla których pamiętam informacje o łatce, jest to, że niektóre iteracje z lat 90. XX wieku… Chcę powiedzieć, że Solaris, ale to może być błąd… oferował serwer dla protokołu AppleTalk Filing Protocol (AFP), który był klasycznym odpowiednikiem NFS dla MacOS . Kłopot polegał na tym, że w klasycznym MacOSie możesz idealnie umieścić
/
komponent pathname;:
zamiast tego jest separator katalogów . Serwer AFP miał robić moralny ekwiwalenttr :/ /:
przy mapowaniu ścieżek przesłanych przez klientów do plików na jego dysku, ale pominęli kilka ścieżek kodu, a ponieważ serwer został zaimplementowany w jądrze, mógł faktycznie wypisać złe wpisy katalogu.(Patrz comp.unix FAQ # 2.2 , podsekcja rozpoczynająca się od „Co jeśli nazwa pliku zawiera„ / ”?), Dla dłuższej wersji powyższego.)
źródło