Do spisu treści
tematu 6
6.5.9 Zamykanie pliku - funkcja close()
Spis treści
Opis
W systemie Linux do zamknięcia otwartego pliku służy funkcja systemowa
close(). Ma ona postać:
int close ( unsigned
int dp ), gdzie argument dp określa deskryptor otwartego pliku.
Funkcja close() zwalnia deskryptor dp, dzięki czemu może
on być powtórnie przydzielony. Jeśli licznik odwołań dla pozycji w tablicy
plików związanej z deskryptorem dp jest większy niż 1 ( zachodzi
taka sytuacja w przypadku wywołania funkcji dup() i fork() ),
to jest po prostu zmniejszany ten licznik i operacja close() kończy
się. Z kolei jeśli licznik odwołań jest równy 1, to zwalniana jest dana
pozycja w tablicy plików oraz wywoływany jest algorytm iput() dla
odpowiadającego jej i-węzła z tablicy i-węzłów. W przypadku gdy inne procesy
odwołują się do tego i-węzła, to jest zmniejszany licznik odwołań do niego.
W przeciwnym razie algorytm iput() zwalnia i-węzeł z pamięci i jeśli
to konieczne uaktualnia jego zawartość na dysku. Wynikiem funkcji close()
jest 0 w przypadku sukcesu lub wartość - EBADF, która oznacza błąd, iż
dp nie jest prawidłowym deskryptorem otwartego pliku.
Algorytm
algorytm close
wejście: deskryptor pliku
wyjście: brak
{
zapamiętaj wskaźnik do tablicy plików, który zapisany jest w tablicy
deskryptorów na pozycji o indeksie równym wartości otrzymanego
deskryptora;
zwolnij dany deskryptor (przypisz odpowiedniemu polu w tablicy
deskryptorów wartość NULL);
zdejmij wszystkie blokady na pliku założone przez proces użytkownika
(procedura locks_remove_locks());
if (nie ma więcej odwołań na daną pozycję w tablicy plików)
{
zwolnij pozycję w tablicy plików;
if (zamykany plik był otwarty do pisania)
zmniejsz licznik piszących do pliku (funkcja put_write_access());
zwolnij i-węzeł z pamięci (algorytm iput);
}
dokonaj aktualizacji licznika odwołań na pozycję w tablicy plików;
return 0;
}
Uwagi
-
Próby użycia przez dany proces deskryptora dp po zakończeniu operacji
close(dp) będą powodowały błąd dopóty, dopóki deskryptor dp
nie zostanie przydzielony powtórnie poprzez inne wywołanie funkcji systemowej.
-
Kiedy proces jest zakończony, wtedy jądro automatycznie zamyka wszystkie
jego otwarte pliki.
-
Implementacja funkcji close()
w Linux 2.0.32 jest taka sama jak w wersji 2.0.30.
Bibliografia
-
Bach M. J. "Budowa systemu operacyjnego Unix"
-
Pliki źródłowe Linuxa: fs/open.c, include/linux/file.h
Autor: Piotr Niedolistek