table of contents
- trixie 4.27.0-1
- trixie-backports 4.29.1-1~bpo13+1
- testing 4.29.1-1
- unstable 4.29.1-1
| close(2) | System Calls Manual | close(2) |
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.
See CAVEATS for a discussion of why close() should not be retried after an error.
STANDARDS¶
POSIX.1-2008.
HISTORIQUE¶
POSIX.1-2001, SVr4, 4.3BSD.
NOTES¶
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.
CAVEATS¶
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).
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.
Many other implementations similarly always close the file descriptor (except in the case of EBADF, meaning that the file descriptor was invalid) even if they subsequently report an error on return from close(). POSIX.1-2008 was silent on this point.
Un programmeur prudent qui veut savoir les erreurs E/S doit faire précéder close() d'un appel fsync(2).
The EINTR error is a somewhat special case. Regarding the EINTR error, POSIX.1-2008 said:
This permits the behavior that occurs on Linux and many other implementations, where, as with other errors that may be reported by close(), the file descriptor is guaranteed to be closed. However, it also permits another possibility: that the implementation returns an EINTR error and keeps the file descriptor open. (According to its documentation, HP-UX's close() does this.) The caller must then once more use close() to close the file descriptor, to avoid file descriptor leaks. This divergence in implementation behaviors provides a difficult hurdle for portable applications, since on many implementations, close() must not be called again after an EINTR error, and on at least one, close() must be called again.
POSIX.1-2024 standardized the behavior of HP-UX, making Linux and many other implementations non-conforming. There are no plans to change the behavior on Linux.
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.
| 29 octobre 2025 | Pages du manuel de Linux 6.16 |