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