Dlaczego istnieje open()
i close()
istnieje w systemie plików Unix?
Czy system operacyjny nie mógł wykryć po raz pierwszy read()
lub write()
został wezwany i zrobić cokolwiek open()
normalnie?
files
filesystems
architecture
api
użytkownik5977637
źródło
źródło
open()
istnieje. „Czy system operacyjny nie mógł po prostu wykryć pierwszego odczytu () lub zapisu () i zrobić cokolwiek, co normalnie zrobiłby open ()?” Czy istnieje odpowiednia sugestia, kiedy nastąpi zamknięcie ?read()
lub dowrite()
którego pliku uzyskać dostęp? Prawdopodobnie przechodząc ścieżkę. Co się stanie, jeśli ścieżka pliku zmieni się podczas uzyskiwania do niego dostępu (między dwomaread()
lubwrite()
wywołaniami)?read()
iwrite()
wyłączonejopen()
.Odpowiedzi:
Dennis Ritchie wspomina w «Ewolucja Unix Time-dzielenie systemowe» że
open
iclose
wraz zread
,write
icreat
były obecne w systemie od samego początku.Wydaje mi się, że system nie byłby
open
iclose
nie byłby nie do pomyślenia, jednak uważam, że skomplikowałoby to projekt. Na ogół chcesz wykonywać wiele wywołań odczytu i zapisu, a nie tylko jedno, i było to prawdopodobnie szczególnie prawdziwe na tych starych komputerach z bardzo ograniczoną pamięcią RAM, z której pochodzi system UNIX. Posiadanie uchwytu, który utrzymuje bieżącą pozycję pliku, upraszcza to. Jeśliread
lubwrite
gdyby zwrócili uchwyt, musieliby zwrócić parę - uchwyt i własny status zwrotu. Część uchwytu pary byłaby bezużyteczna dla wszystkich innych połączeń, co spowodowałoby, że takie ustawienie byłoby niewygodne. Pozostawienie stanu kursora w jądrze pozwala poprawić wydajność nie tylko poprzez buforowanie. Wyszukiwanie ścieżki wiąże się również z pewnymi kosztami - posiadanie uchwytu umożliwia zapłacenie go tylko raz. Co więcej, niektóre pliki w światopoglądzie UNIX nawet nie mają ścieżki systemu plików (lub nie miały - teraz robią to z takimi rzeczami/proc/self/fd
).źródło
open
/close
, na pewno zaimplementujesz takie rzeczy, jak/dev/stdout
zezwalanie na potokowanie.open()
naget_inode()
i sprawił, że cały system jest bardziej sztywna (niemożliwy do odczytu / zapisu do tego samego pliku w kilku miejscach jednocześnie).Następnie wszystkie wywołania
read
iwrite
musiałyby przekazywać te informacje o każdej operacji:Czy uważa niezależnych połączeń
open
,read
,write
iclose
być prostsze niż jednofunkcyjnych I / O komunikat opiera się na filozofii projektowania. Programiści uniksowi postanowili używać prostych operacji i programów, które można łączyć na wiele sposobów, zamiast jednej operacji (lub programu), która robi wszystko.źródło
read
iwrite
nie są ograniczone do plików znajdujących się w systemie plików, i to jest podstawowa decyzja projektowa w Uniksie, jak wyjaśnia pjc50.lseek
)Koncepcja uchwytu pliku jest ważna ze względu na wybór projektu przez UNIX, że „wszystko jest plikiem”, w tym rzeczy, które nie są częścią systemu plików. Takie jak napędy taśm, klawiatura i ekran (lub typ teletechniczny!), Czytniki perforowanych kart / taśm, połączenia szeregowe, połączenia sieciowe oraz (kluczowy wynalazek UNIX) bezpośrednie połączenia z innymi programami zwanymi „potokami”.
Jeśli spojrzysz na wiele prostych, standardowych narzędzi UNIX, takich jak
grep
, zwłaszcza w ich oryginalnych wersjach, zauważysz, że nie zawierają one wywołań,open()
aclose()
tylkoread
i tylkowrite
. Uchwyty plików są ustawiane przez powłokę poza programem i przekazywane podczas uruchamiania. Dlatego program nie musi dbać o to, czy zapisuje do pliku, czy do innego programu.Jak również
open
, że inne sposoby na uzyskanie deskryptory plików sąsocket
,listen
,pipe
,dup
, i bardzo Heath Robinson mechanizm wysyłania deskryptorów plików na rurach: https://stackoverflow.com/questions/28003921/sending-file-descriptor-by-linux -gniazdo elektryczneEdycja: kilka notatek z wykładu opisujących warstwy pośrednie i sposób, w jaki pozwala to rozsądnie działać O_APPEND. Pamiętaj, że przechowywanie danych i-węzłów w pamięci gwarantuje, że system nie będzie musiał ponownie pobierać ich do następnej operacji zapisu.
źródło
creat
, ilisten
nie tworzy fd, ale kiedy (i jeśli) przychodzi żądanie podczas nasłuchiwania,accept
tworzy i zwraca fd dla nowego (podłączonego) gniazda.pipe
został wprowadzony kilka lat po rozpoczęciu rozwoju Uniksa.Odpowiedź brzmi nie, ponieważ open () i close () odpowiednio tworzą i niszczą uchwyt. Są chwile (cóż, cały czas, naprawdę), w których możesz chcieć zagwarantować, że jesteś jedynym dzwoniącym o określonym poziomie dostępu, ponieważ inny dzwoniący (na przykład) zapisujący do pliku, który analizujesz, może nieoczekiwanie opuścić aplikacja w nieznanym stanie lub prowadząca do blokady lub impasu, np. lemat „Philosophers”.
Nawet bez tego rozważenia należy wziąć pod uwagę wpływ na wydajność; close () pozwala systemowi plików (jeśli jest to właściwe lub jeśli zostałeś do niego powołany) opróżnić zajmowany bufor, co jest kosztowną operacją. Kilka kolejnych edycji strumienia w pamięci jest o wiele bardziej wydajnych niż kilka zasadniczo niezwiązanych cykli odczytu-zapisu-modyfikacji w systemie plików, który, jak wiadomo, istnieje w odległości pół świata rozproszonej w centrum danych o wartości dużej pamięci masowej o dużych opóźnieniach. Nawet w przypadku pamięci lokalnej pamięć jest zwykle o wiele rzędów wielkości szybsza niż pamięć masowa.
źródło
Open () oferuje sposób blokowania plików podczas ich używania. Gdyby pliki były automatycznie otwierane, odczytywane / zapisywane, a następnie ponownie zamykane przez system operacyjny, nic nie powstrzymałoby innych aplikacji zmieniających te pliki między operacjami.
Chociaż można to zarządzać (wiele systemów obsługuje niewyłączny dostęp do plików) dla uproszczenia, większość aplikacji zakłada, że otwarte przez nich pliki się nie zmieniają.
źródło
Ponieważ ścieżka pliku może się poruszać, zakładając, że pozostanie niezmieniona.
źródło
Odczytywanie i zapisywanie w systemie plików może obejmować wiele różnych schematów buforowania, porządkowanie systemu operacyjnego, zarządzanie dyskami niskiego poziomu i wiele innych potencjalnych działań. Więc działania
open()
iclose()
służą jako konfiguracja dla tego rodzaju działań pod maską. Różne implementacje systemu plików mogą być w razie potrzeby wysoce dostosowywane i nadal pozostają przezroczyste dla programu wywołującego.Jeśli system operacyjny nie miałby otwierać / zamykać, to przy pomocy
read
lubwrite
, te działania na plikach nadal musiałyby wykonywać wszelkie inicjalizacje, opróżnianie bufora / zarządzanie itp. Za każdym razem. Jest to dużo narzutu, który należy nakładać na powtarzalne odczyty i zapisy.źródło
Mantra uniksowa to „oferować jeden sposób robienia rzeczy”, co oznacza „faktoring” na (wielokrotnego użytku) elementy, które można dowolnie łączyć. Tj. W tym przypadku oddziel tworzenie i niszczenie uchwytów plików od ich użycia. Ważne korzyści pojawiły się później, dzięki potokom i połączeniom sieciowym (są one również obsługiwane za pomocą uchwytów plików, ale są tworzone w inny sposób). Możliwość przesyłania uchwytów plików (np. Przekazywanie ich do procesów potomnych jako „otwartych plików”, które przetrwają
exec(2)
, a nawet do niepowiązanych procesów przez potok) są możliwe tylko w ten sposób. Szczególnie jeśli chcesz zaoferować kontrolowany dostęp do chronionego pliku. Możesz więc np. Otworzyć/etc/passwd
do pisania i przekaż to procesowi potomnemu, który nie może otworzyć tego pliku do pisania (tak, wiem, że to absurdalny przykład, możesz edytować coś bardziej realistycznego).źródło