Man page - close(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro zh_TW zh_CN de

Manual

close

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
Processus multithreadés et close()
Gérer les erreurs renvoyées par close()
VOIR AUSSI
TRADUCTION

NOM

close - Fermer un descripteur de fichier

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <unistd.h>

int close(int fd );

DESCRIPTION

close () ferme le descripteur de fichier fd , de maniĂšre Ă  ce qu’il ne rĂ©fĂ©rence plus aucun fichier, et puisse ĂȘtre rĂ©utilisĂ©. Tous les verrouillages (consultez fcntl (2)) sur le fichier qui lui Ă©tait associĂ©, appartenant au processus, sont supprimĂ©s quel que soit le descripteur de fichier qui fut utilisĂ© pour obtenir le verrouillage. Cela a quelques consĂ©quences malheureuses il convient d’ĂȘtre extrĂȘmement prudent lors de l’utilisation de verrouillages d’enregistrements coopĂ©ratifs. Voir fcntl (2) pour une discussion sur les risques et consĂ©quences et sur l’utilisation (probablement prĂ©fĂ©rable) des verrouillages de description de fichier ouvert.

Si fd est le dernier descripteur de fichier qui se réfÚre à une description de fichier ouvert sous-jacente (consultez open (2)), les ressources associées à la description de fichier ouvert sont libérées. Si le descripteur était la derniÚre référence sur un fichier supprimé avec unlink (2), le fichier est effectivement effacé.

VALEUR RENVOYÉE

Si elle rĂ©ussit, la fonction close () renvoie zĂ©ro. En cas d’erreur, elle renvoie -1 et elle remplit errno pour indiquer l’erreur.

ERREURS

EBADF

Le descripteur de fichier fd est invalide.

EINTR

L’appel systĂšme close () a Ă©tĂ© interrompu par un signal ; consultez signal (7).

EIO

Une erreur d’entrĂ©e-sortie s’est produite.

ENOSPC

EDQUOT

Sur NFS, ces erreurs ne sont en principe pas signalĂ©es lors de la premiĂšre Ă©criture qui dĂ©passe l’espace de stockage disponible, mais lors d’un write (2), fsync (2) ou close () consĂ©cutif.

Voir les NOTES pour un point sur la raison pour laquelle close () ne devrait pas réessayer aprÚs une erreur.

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, SVr4, 4.3BSD.

NOTES

Une fermeture sans erreur ne garantit pas que les donnĂ©es ont Ă©tĂ© vraiment Ă©crites sur le disque, car le noyau repousse les Ă©critures le plus tard possible. Il n’est pas frĂ©quent qu’un systĂšme de fichiers vide les tampons dĂšs la fermeture d’un flux. Si vous dĂ©sirez vous assurer que les informations sont en sĂ»retĂ© sur le disque, utilisez fsync (2) (mais des considĂ©rations matĂ©rielles entrent en jeu Ă  ce moment).

L’attribut de descripteur de fichier close-on-exec peut ĂȘtre utilisĂ© pour s’assurer qu’un descripteur de fichier est fermĂ© automatiquement en cas de succĂšs de execve (2) ; voir fcntl (2) pour des dĂ©tails.

Processus multithreadés et close()

Il est probablement imprudent de fermer des descripteurs de fichier alors qu’ils peuvent peut-ĂȘtre ĂȘtre utilisĂ©s par des appels systĂšme dans d’autres threads du mĂȘme processus. Puisqu’un descripteur de fichier peut ĂȘtre rĂ©utilisĂ©, il y a des conditions de concurrence obscures qui peuvent provoquer des effets de bord non dĂ©sirĂ©s.

Par ailleurs, imaginez un scĂ©nario oĂč deux threads effectuent plusieurs opĂ©rations sur le mĂȘme descripteur de fichier :

(1)

Un thread est bloquĂ© dans un appel systĂšme E/S sur le descripteur de fichier. Par exemple, il essaie de write (2) dans un tube dĂ©jĂ  plein ou de read (2) depuis le socket d’un flux qui n’a pas de donnĂ©es disponibles actuellement.

(2)

Un autre thread ferme le descripteur de fichier.

Dans cette situation, le comportement varie selon les systĂšmes. Sur certains, quand le descripteur de fichier est fermĂ©, l’appel systĂšme qui bloque renvoie immĂ©diatement une erreur.

Sur Linux (et probablement d’autres systĂšmes), le comportement est diffĂ©rent : l’appel systĂšme E/S bloquant conserve une rĂ©fĂ©rence Ă  la description du fichier ouvert sous-jacent et celle-ci garde la description ouverte jusqu’à ce que l’appel systĂšme E/S se termine (voir open (2) pour un point sur les descriptions de fichiers ouverts). Ainsi, l’appel systĂšme bloquant du premier thread peut se terminer avec succĂšs aprĂšs le close () du deuxiĂšme thread.

Gérer les erreurs renvoyées par close()

Un programmeur prudent vĂ©rifiera le code de retour de close (), car il est possible qu’une erreur correspondant Ă  un appel write (2) antĂ©rieur ne soit rapportĂ©e que lors du close () final. Ne pas vĂ©rifier le code de retour lorsqu’un fichier est fermĂ© peut conduire Ă  une perte silencieuse de donnĂ©es. Cela est principalement vrai dans le cas de systĂšmes de fichiers NFS, ou avec l’utilisation des quotas de disques.

Remarquez cependant que la valeur de retour ne devrait ĂȘtre utilisĂ©e que pour les diagnostics (Ă  savoir pour prĂ©venir une application qu’il peut rester des E/S en attente ou Ă©chouĂ©es) ou de correction (comme pour Ă©crire un fichier une ou plusieurs fois ou pour crĂ©er une sauvegarde).

RĂ©essayer close () aprĂšs un renvoi d’échec n’est pas la bonne maniĂšre de faire, car il peut en rĂ©sulter que le descripteur d’un fichier qui serait rĂ©utilisĂ© Ă  partir d’un autre thread se ferme. Cela est possible car le noyau Linux abandonne toujours tĂŽt le descripteur de fichier lors d’une opĂ©ration de fermeture, ce qui le libĂšre pour ĂȘtre rĂ©utilisé ; les Ă©tapes de renvoi d’erreur telles que l’effacement des donnĂ©es sur le systĂšme de fichiers ou le pĂ©riphĂ©rique arrivent plus tard dans l’opĂ©ration de fermeture.

De mĂȘme, beaucoup d’autres implĂ©mentations ferment toujours le descripteur de fichier (sauf en cas de EBADF , qui signifie que le descripteur de fichier n’était pas valable), mĂȘme si elles signalent ensuite une erreur renvoyĂ©e par close (). POSIX.1 ne dit rien aujourd’hui sur ce point mais ce comportement sera rendu obligatoire dans la prochaine version majeure du standard.

Un programmeur prudent qui veut savoir les erreurs E/S doit faire prĂ©cĂ©der close () d’un appel fsync (2).

L’erreur EINTR est un cas un peu particulier. Concernant l’erreur EINTR , POSIX.1-2008 dit :

Si close () est interrompu par un signal qui doit ĂȘtre rĂ©cupĂ©rĂ©, il renverra -1 et positionnera errno sur EINTR et l’état de fildes ne sera pas spĂ©cifiĂ©.

Cela autorise un comportement qui arrive sur Linux et beaucoup d’autres implĂ©mentations, oĂč, comme pour beaucoup d’erreurs pouvant ĂȘtre signalĂ©es par close (), le descripteur de fichier se fermera assurĂ©ment. NĂ©anmoins, cela permet aussi une autre possibilité : l’implĂ©mentation renvoie une erreur EINTR et laisse le descripteur de fichier ouvert (selon sa documentation, le close () de HP-UX fait cela). L’appelant doit donc utiliser une fois de plus close () pour fermer le descripteur de fichier, afin d’éviter des fuites du descripteur de fichier. Cette divergence de comportements dans l’implĂ©mentation apporte un obstacle difficile Ă  la portabilitĂ© des applications car sur beaucoup d’implĂ©mentations, close () ne doit pas ĂȘtre rappelĂ© aprĂšs une erreur EINTR , tandis que sur au moins une d’elles, close () doit ĂȘtre rappelĂ©. Il est envisagĂ© de s’occuper de ce casse-tĂȘte dans la prochaine version majeure du standard POSIX.1.

VOIR AUSSI

close_range (2), fcntl (2), fsync (2), open (2), shutdown (2), unlink (2), fclose (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .