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

  1. 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.
  2. Kiedy proces jest zakończony, wtedy jądro automatycznie zamyka wszystkie jego otwarte pliki.
  3. Implementacja funkcji close() w Linux 2.0.32 jest taka sama jak w wersji 2.0.30.

Bibliografia

  1. Bach M. J. "Budowa systemu operacyjnego Unix"
  2. Pliki źródłowe Linuxa: fs/open.c, include/linux/file.h

Autor: Piotr Niedolistek