Do spisu tresci tematu 6

6.6 Zamykanie pliku - funkcja close()

Spis tresci


Wprowadzenie

Funkcja close() zwalnia deskryptor pliku, tze moze byc on powtornie przydzielony. Jesli deskryptor jest ostatnim, ktory odnosi sie do danej pozycji w tablicy plikow, wowczas pozycja ta jest rowniez zwalniana.Zdejmowane sa wszelkie blokady zalozone przez proces na pliku.


Definicja

int close(int fd)

Wynik - 0 w przypadku sukcesu lub -1 w przypadku bledu(errno przyjmuje wartosc EBADF - fd nie jest prawidlowym deskryptorem otwartego pliku)

fd - deskryptor zamykanego pliku.


Implementacja

int close(int fd)


{

	filp=fd[fd];/* tablica fd-tablica deskryptorow procesu;filp-wskaznik do pozycji w t.p.(tablicy plikow)odpowiadajacy zwalnianemu deskryptorowi*/

	fd[fd]=NULL;

	inode=filp->f_inode; /* inode- i-wezel zamykanego pliku*/

	locks_remove_locks();/* zdjecie blokad na pliku zalozonych przez proces*/;

	filp->fcount--; /* zmniejszamy licznik odwolan do pozycji w t.p.*/

	if(fcount>0) /* ktos jeszcze korzysta z tej pozycji w t.p.*/

		return(0);

	filp->f_inode=NULL;/* zwalniamy pozycje w t.p. */

	if(zwalniany plik otwieralismy do pisania) 

		inode->i_writecount--;

	iput(inode);

	return(0);

}


Uwagi

  1. Opisujac funkcje close dokonalem malego przeklamania piszac, ze w przypadku bledu funkcja zwraca -1 a na zmiennej errno zwraca kod bledu (jak w interfejsie C do funkcji close )zamiast pisac, ze zwraca wtedy ten kod (jak w zrodlach). Uwazalem, ze opis funkcji close zgodny z rzeczywistoscia(zrodla) moglby byc mylacy dla potencjalnych czytelnikow-programistow.
  2. Zwolnienienie pozycji w tablicy plikow(ktora jest w rzeczywistosci dwustronna lista) nie jest zwiazane z dodatkowym fizycznym zwalnianiem pamieci przeznaczonej na strukture file. Patrz tez uwagi przy opisie funkcji open.

Bibliografia

  1. Pliki zrodlowe Linuxa: ./fs/open.c
  2. Pomoc ("man") dostepna pod Unixem

Autor: Marcin Rychlik