Do spisu treści tematu 6
 

  6.5.3 Otwieranie pliku - funkcja open()

  Spis treści


 Wstęp

Funkcja systemowa open()służy do otwierania pliku, czyli przygotowuje plik do to tego, że proces będzie korzystał z danych weń zawartych. Jej wywołanie jest pierwszą czynnością, jaką musi wykonać proces chcący uzyskać dostęp do informacji znajdujących się w pliku.
Wynikiem działania funkcji open() jest liczba naturalna zwana deskryptorem pliku. W ramach jednego procesu jest ona wykorzystywana jako identyfikator pliku; dwa otwarte przez proces pliki mają różne deskryptory. Jeden plik może zostać przez proces otwarty dwa razy i ma wtedy dwa różne deskryptory. Deskryptor jest liczbą niosącą informację lokalną tzn. jeśli dwa pliki mają w dwu procesach te same deskryptory to może być tak, że jest to ten sam plik, a mogą być to też zupełnie różne pliki.
Deskryptor pliku jest indeksem w tablicy deskryptorów plików. Jeden proces nie może mieć więcej otwartych plików niż pewna stała, w Linuxie wynosząca 1024, oznaczająca wielkość tejże tablicy. Tablicę deskryptorów uwzględniono w opisie struktur danych systemu plików.
 


 Opis algorytmu

Pierwszą czynnością jest znalezienie wolnego miejsca w tablicy desktyptorów plików. Wybierany jest deskryptor o najmniejszym wolnym numerze, zostanie on zwolniony, jeśli operacja otwarcia pliku nie przyniesie efektu. Jeśli brak wolnych deskryptorów zwracany jest bład.
Następnie nazwa pliku, który ma zostać otwarty, wpisywana jest do przestrzeni danych jądra w celu przyspieszenia działania następujących potem operacji. W końcowej części wykonywania algorytmu nazwa jest stamtąd usuwana.
Wyszukiwane jest wolne miejsce w tablicy plików, po czym znajdowany jest i-węzeł odpowiadający plikowi, który należy otworzyć. Podczas procesu znajdowania i-węzła wykorzystywane są informacje o atrybutach otwarcia.
Teraz wykonanie funkcji może potoczyć się wielorako, w zależności od tego, jaki jest cel otwarcia pliku, czyli jakie były parametry otwarcia.
Jeśli plik ma zostać stworzony, to jądro sprawdza, czy taki plik już istnieje i zwraca błąd, gdy jest to prawda. Błąd pojawia się także wtedy gdy proces wywołujący nie posiada praw dostępu. Jeśli prawa są w porządku pobierany jest nowy, wolny i-węzeł. Podczas znajdowania nowego i-węzła zakładana jest blokada na i-węzeł katalogu macierzystego, by można było dołączyć do niego nowy i-węzeł.
W sytuacji, gdy nastąpiła próba otwarcia do czytania katalogu lub pliku z systemu plików przeznaczonego tylko do odczytu zwracany jest błąd.
Jeśli plik otwierany jest z zamiarem obcięcia, wywoływana jest funkcja zwalniająca jego bloki.
Jeśli plik ma zostać otwarty do pisania teraz podejmowana jest próba uzyskania dostępu do pisania w pliku. W przypadku niepowodzenia i-węzeł jest zwalniany, a funkcja zwraca błąd.
Teraz wskaźnik do znalezionego i-węzła jest wpisywany do tablicy plików wraz z ustawieniem bieżącej pozycji w pliku (czyli miejsca, od którego rozpocznie się czytanie z lub pisanie do pliku). Jest ona ustawiana na 0, co oznacza, że plik będzie czytany (lub zapisywany) od początku.
Potem wywoływana jest ta część funkcji otwierania pliku, która zależy od tego, z jakim systemem mamy do czynienia. W systemie plików EXT2 ta część jest pusta, więc nie zostanie tu omówiona.
W końcu tablica deskryptorów, w miejscu uprzednio wybranym, wypełniana jest wskaźnikiem do wybranej pozycji w tablicy plików a indeks miejsca, w którym jest wypełniana zostaje zwrócony jako wynik działania funkcji.
 


Sposoby otwarcia pliku

Plik można otworzyć na wiele różnych sposobów. Chodzi tu zasadniczo nie tyle o sposoby otwarcia, co cele, motywacje. Można zatem np. otworzyć plik tylko w celu czytania, pisania bądź by wykonywać obie te czynności.
Jest też możliwość otwarcia pliku w celu jego stworzenia, przy czym można sprawić albo, by próba istniejącego już pliku kończyła się błędem albo by błąd nie był sygnalizowany. Również obcięcie pliku można wykonać otwierając go.
Programista może też życzyć sobie, by tuż po otwarciu plik był gotowy do pisania na swym końcu, tzn. chce dopisywać do pliku.
Ostatnie dwie możliwości otwarcia pliku związane są z tym, że proces wykoujący operacje na otwartym w ten sposób pliku będzie wstrzymywany lub nie w oczekiwaniu na pewne zdarzenia.
Proces może mianowicie życzyć sobie nie być wstrzymywanym przy wykonywaniu operacji na pliku, jeśli operacja ta miałaby być zablokowana w oczekiwaniu na jakiś zdarzenie. Wtedy, po wywołaniu funkcji wykonującej operacje na pliku, albo jest ona możliwa do wykonania natychmiast i zostaje wykonana albo też proces musiałby na nią czekać więc operacja jest niewykonana i zwracany jest błąd.
Istnieje także możliwość żądania, by operacje na pliku były blokujące w ten sposób, że wstrzymywałyby proces, aż do chwili ich fizycznego wykonania np. na dysku. Taki sposób działania na pliku jest nazywany synchronicznym.
Wymienione sposoby można ze sobą łączyć, tzn. można wymagać, by plik został otwarty do pisania i czytania synchronicznego, z tym, że znacznik pozycji w pliku ma zostać ustawiony na koniec pliku.
 

 Źródła informacji

Maurice J. Bach "Budowa systemu operacyjnego UNIX"
Projekt Linux - opis funkcji open 



Autor: Adam Kieżun