plucky (2) close.2.gz

Provided by: manpages-fr-dev_4.25.1-1_all bug

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.