.\" -*- coding: UTF-8 -*- .\" Copyright 1992, Drew Eckhardt .\" Copyright 2006-2014, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH open 2 "8 février 2026" "Pages du manuel de Linux 6.18" .SH NOM open, openat, creat \- Ouvrir ou créer éventuellement un fichier .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP,\ \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .P \fBint open(const char *\fP\fIpath\fP\fB, int \fP\fIflags\fP\fB, ...\fP \fB \fP\f[R]/*\fB mode_t \fP\fImode\fP\fB \fP\f[R]*/\fB );\fP .P \fBint creat(const char *\fP\fIpath\fP\fB, mode_t \fP\fImode\fP\fB);\fP .P \fBint openat(int \fP\fIdirfd\fP\fB, const char *\fP\fIpath\fP\fB, int \fP\fIflags\fP\fB, ...\fP \fB \fP\f[R]/*\fB mode_t \fP\fImode\fP\fB \fP\f[R]*/\fB );\fP .P /* Documented separately, in \fBopenat2\fP(2): \& */ \fBint openat2(int \fP\fIdirfd\fP\fB, const char *\fP\fIpath\fP\fB,\fP \fB const struct open_how *\fP\fIhow\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .P .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7)) : .RE .P \fBopenat\fP() : .nf Depuis la glibc 2.10 : _POSIX_C_SOURCE >= 200809L avant la glibc 2.10 : _ATFILE_SOURCE .fi .SH DESCRIPTION The \fBopen\fP() system call opens the file specified by \fIpath\fP. If the specified file does not exist, it may optionally (if \fBO_CREAT\fP is specified in \fIflags\fP) be created by \fBopen\fP(). .P La valeur renvoyée par \fBopen\fP() est un descripteur de fichier, un petit entier positif ou nul qui est un indice d'entrée dans la table de processus de descripteurs de fichiers ouverts. Le descripteur de fichier est ensuite utilisé dans d'autres appels système (\fBread\fP(2), \fBwrite\fP(2), \fBlseek\fP(2), \fBfcntl\fP(2), etc.) pour se référer au fichier ouvert. Le descripteur de fichier renvoyé par un appel réussi sera celui du plus petit numéro de descripteur de fichier non actuellement ouvert par le processus. .P Par défaut, le nouveau descripteur de fichier est configuré pour rester ouvert après un appel à \fBexecve\fP(2) (son attribut \fBFD_CLOEXEC\fP décrit dans \fBfcntl\fP(2) est initialement désactivé). L'attribut \fBO_CLOEXEC\fP décrit ci\-dessous permet de modifier ce comportement par défaut. La position dans le fichier est définie au début du fichier (consultez \fBlseek\fP(2)). .P A call to \fBopen\fP() creates a new \fIopen file description\fP, an entry in the system\-wide table of open files. The open file description records the file offset and the file status flags (see below). A file descriptor is a reference to an open file description; this reference is unaffected if \fIpath\fP is subsequently removed or modified to refer to a different file. For further details on open file descriptions, see NOTES. .P Le paramètre \fIflags\fP est l'un des éléments \fBO_RDONLY\fP, \fBO_WRONLY\fP ou \fBO_RDWR\fP qui réclament respectivement l'ouverture du fichier en lecture seule, écriture seule, ou lecture/écriture. .P .\" SUSv4 divides the flags into: .\" * Access mode .\" * File creation .\" * File status .\" * Other (O_CLOEXEC, O_DIRECTORY, O_NOFOLLOW) .\" though it's not clear what the difference between "other" and .\" "File creation" flags is. I raised an Aardvark to see if this .\" can be clarified in SUSv4; 10 Oct 2008. .\" http://thread.gmane.org/gmane.comp.standards.posix.austin.general/64/focus=67 .\" TC1 (balloted in 2013), resolved this, so that those three constants .\" are also categorized" as file status flags. .\" De plus, zéro ou plusieurs attributs de création de fichier et attributs d'état de fichier peuvent être indiqués dans \fIflags\fP avec un OU binaire. Les \fIattributs de création de fichier\fP sont \fBO_CLOEXEC\fP, \fBO_CREAT\fP, \fBO_DIRECTORY\fP, \fBO_EXCL\fP, \fBO_NOCTTY\fP, \fBO_NOFOLLOW\fP, \fBO_TMPFILE\fP et \fBO_TRUNC\fP. Les \fIattributs d'état de fichier\fP sont tous les autres attributs indiqués ci\-dessous. La distinction entre ces deux groupes est que les attributs d'état de fichier modifient la sémantique de l'opération d'ouverture elle\-même, tandis que les attributs de l'état du fichier modifient celle des opérations d'E/S qui suivent. Les attributs d'état de fichier peuvent être lus et (dans certains cas) modifiés ; consultez \fBfcntl\fP(2) pour plus de précisions. .P La liste complète des attributs de création et d'état de fichier est la suivante. .TP \fBO_APPEND\fP Le fichier est ouvert en mode «\ ajout\ ». Avant chaque \fBwrite\fP(2), la tête de lecture/écriture est placée à la fin du fichier comme avec \fBlseek\fP(2). La modification de la position dans le fichier et l'opération d'écriture sont effectuées sous forme d'étape atomique unique. .IP .\" For more background, see .\" http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=453946 .\" http://nfs.sourceforge.net/ Il y a un risque d'endommager le fichier lorsque \fBO_APPEND\fP est utilisé, sur un système de fichiers NFS, si plusieurs processus tentent d'ajouter des données simultanément au même fichier. Ceci est dû au fait que NFS ne gère pas l'opération d'ajout de données dans un fichier, aussi le noyau du client est obligé de la simuler, ce qui est impossible sans concurrence des tâches. .TP \fBO_ASYNC\fP Déclencher un signal (\fBSIGIO\fP par défaut, mais peut être changé via \fBfcntl\fP(2)) lorsque la lecture ou l'écriture deviennent possibles sur ce descripteur. Ceci n'est possible que pour les terminaux, pseudoterminaux, sockets et (depuis Linux 2.6) tubes et FIFO. Consultez \fBfcntl\fP(2) pour plus de détails. Consultez aussi \fBBOGUES\fP ci\-dessous. .TP \fBO_CLOEXEC\fP (depuis Linux 2.6.23) .\" NOTE! several other man pages refer to this text .\" FIXME . for later review when Issue 8 is one day released... .\" POSIX proposes to fix many APIs that provide hidden FDs .\" http://austingroupbugs.net/tag_view_page.php?tag_id=8 .\" http://austingroupbugs.net/view.php?id=368 Activer l'attribut « close\-on\-exec » pour le nouveau descripteur de fichier. En précisant cet attribut, on évite au programme d'avoir à utiliser les opérations \fBF_SETFD\fP de \fBfcntl\fP(2) pour positionner l'attribut \fBFD_CLOEXEC\fP. .IP .\" This flag fixes only one form of the race condition; .\" The race can also occur with, for example, file descriptors .\" returned by accept(), pipe(), etc. Notez que le recours à cet attribut est indispensable pour certains programmes multithreadés. En effet, l'utilisation d'une opération \fBF_SETFD\fP de \fBfcntl\fP(2) pour positionner l'attribut \fBFD_CLOEXEC\fP ne suffit pas à éviter une situation d'accès concurrents si un thread ouvre un descripteur de fichier et tente d'activer l'attribut « close\-on\-exec » au moyen de \fBfcntl\fP(2) au moment où un autre thread exécute \fBfork\fP(2) suivi de \fBexecve\fP(2). Selon l'ordre dans lequel ces opérations s'exécutent, cette concurrence peut aboutir à ce que le descripteur de fichier renvoyé par \fBopen\fP() soit involontairement mis à disposition du programme exécuté par le processus enfant créé par \fBfork\fP(2). (Ce type de concurrence est en principe possible pour tout appel système qui crée un descripteur de fichier dont l'attribut « close\-on\-exec » est actif ; certains appels système de Linux offrent des équivalents de l'attribut \fBO_CLOEXEC\fP pour régler ce problème.) .TP \fBO_CREAT\fP If \fIpath\fP does not exist, create it as a regular file. .IP Le propriétaire (identifiant utilisateur) du nouveau fichier est positionné sur l'identifiant de l'utilisateur effectif du processus. .IP .\" As at Linux 2.6.25, bsdgroups is supported by ext2, ext3, ext4, and .\" XFS (since Linux 2.6.14). Le groupe (identifiant de groupe) propriétaire du nouveau fichier est soit positionné sur l'identifiant du groupe effectif du processus (dans la sémantique de System V), soit sur celui du répertoire parent (dans la sémantique de BSD). Sur Linux, le comportement varie selon que le positionnement du bit set\-group\-ID sur le répertoire parent : s'il est positionné, la sémantique de BSD s'applique, sinon c'est celle de System V. Pour certains de fichiers, le comportement dépend aussi des options de montage \fIbsdgroups\fP et \fIsysvgroups\fP décrites dans \fBmount\fP(8). .IP L'argument \fImode\fP indique les bits du mode du fichier à appliquer lors de la création d'un nouveau fichier. Si ni \fBO_CREAT\fP, ni \fBO_TMPFILE\fP ne sont indiqués dans \fIflags\fP, \fImode\fP est ignoré (et peut ainsi être indiqué en tant que \fB0\fP voire absent). L'argument \fImode\fP \fBdoit\fP être fourni si \fBO_CREAT\fP ou \fBO_TMPFILE\fP est indiqué dans \fIflags\fP ; s'il n'est pas indiqué, des octets arbitraires de la pile s'appliqueront comme mode du fichier. .IP Le mode effectif est modifié par le \fIumask\fP du processus de manière classique : en l'absence d'ACL (liste de contrôle d'accès) par défaut, les droits du fichier créé sont \fI(mode\ &\ \[ti]umask)\fP. .IP Notez que \fImode\fP ne s'applique qu'aux accès ultérieurs au fichier nouvellement créé ; l'appel \fBopen\fP() qui crée un fichier dont le mode est en lecture seule fournira quand même un descripteur de fichier en lecture et écriture. .IP Les constantes symboliques suivantes sont disponibles pour \fImode\fP\ : .RS .TP 9 \fBS_IRWXU\fP 00700 L'utilisateur (propriétaire du fichier) a les autorisations de lecture, écriture, exécution. .TP \fBS_IRUSR\fP 00400 L'utilisateur a l'autorisation de lecture. .TP \fBS_IWUSR\fP 00200 L'utilisateur a l'autorisation d'écriture. .TP \fBS_IXUSR\fP 00100 L'utilisateur a l'autorisation d'exécution. .TP \fBS_IRWXG\fP 00070 Le groupe a les autorisations de lecture, écriture, exécution. .TP \fBS_IRGRP\fP 00040 Le groupe a l'autorisation de lecture. .TP \fBS_IWGRP\fP 00020 Le groupe a l'autorisation d'écriture. .TP \fBS_IXGRP\fP 00010 Le groupe a l'autorisation d'exécution. .TP \fBS_IRWXO\fP 00007 Tout le monde a les autorisations de lecture, écriture, exécution. .TP \fBS_IROTH\fP 00004 Tout le monde a l'autorisation de lecture. .TP \fBS_IWOTH\fP 00002 Tout le monde a l'autorisation d'écriture. .TP \fBS_IXOTH\fP 00001 Tout le monde a l'autorisation d'exécution. .RE .IP Selon POSIX, le positionnement des autres bits dans \fImode\fP n'a pas d'effet spécifié. Sur Linux, les bits suivants sont également gérés dans \fImode\fP : .RS .TP 9 \fBS_ISUID\fP 0004000 bit set\-user\-ID. .TP \fBS_ISGID\fP 0002000 bit set\-group\-ID (voir \fBinode\fP(7)). .TP \fBS_ISVTX\fP 0001000 bit sticky (voir \fBinode\fP(7)). .RE .TP \fBO_DIRECT\fP (depuis Linux 2.4.10) Essayer de minimiser les effets du cache d'entrée\-sortie sur ce fichier. Cela dégradera en général les performances, mais est utile dans des situations spéciales, comme lorsque les applications ont leur propre cache. Les entrées\-sorties de fichier sont faites directement de et vers les tampons d'espace utilisateur. L'ajout de l'attribut \fBO_DIRECT\fP fait que les entrées\-sorties sont synchrones ; en réalité un effort est fait pour rendre le transfert synchrone mais cela n'offre pas la garantie fournie par l'attribut \fBO_SYNC\fP que les données et métadonnées sont transférées. Pour garantir des entrées\-sorties synchrones, l'attribut \fBO_SYNC\fP doit être utilisé en plus de l'attribut \fBO_DIRECT\fP. Consultez la section \fBNOTES\fP ci\-dessous. .IP Une interface à la sémantique similaire (mais dépréciée) pour les périphériques blocs est décrite dans \fBraw\fP(8). .TP \fBO_DIRECTORY\fP .\" But see the following and its replies: .\" http://marc.theaimsgroup.com/?t=112748702800001&r=1&w=2 .\" [PATCH] open: O_DIRECTORY and O_CREAT together should fail .\" O_DIRECTORY | O_CREAT causes O_DIRECTORY to be ignored. If \fIpath\fP is not a directory, cause \fBopen\fP() to fail. This flag was added in Linux 2.1.126, to avoid denial\-of\-service problems if \fBopendir\fP(3) is called on a FIFO or tape device. .TP \fBO_DSYNC\fP Les opérations d'écriture dans le fichier se dérouleront selon les conditions d'exécution des opérations E/S synchrones avec garantie d'intégrité des \fIdonnées\fP. .IP Au moment où \fBwrite\fP(2) (ou un appel similaire) renvoie une donnée, elle a été transmise au matériel sur lequel s'exécute l'appel, avec toutes les métadonnées du fichier qui pourraient être nécessaires à la récupération de cette donnée (c'est à dire comme si chaque appel à \fBwrite\fP(2) était suivi d'un appel à \fBfdatasync\fP(2)). \fIConsultez VERSIONS\fP. .TP \fBO_EXCL\fP Ensure that this call creates the file: if this flag is specified in conjunction with \fBO_CREAT\fP, and \fIpath\fP already exists, then \fBopen\fP() fails with the error \fBEEXIST\fP. .IP .\" POSIX.1-2001 explicitly requires this behavior. When these two flags are specified, symbolic links are not followed: if \fIpath\fP is a symbolic link, then \fBopen\fP() fails regardless of where the symbolic link points. .IP In general, the behavior of \fBO_EXCL\fP is undefined if it is used without \fBO_CREAT\fP. There is one exception: on Linux 2.6 and later, \fBO_EXCL\fP can be used without \fBO_CREAT\fP if \fIpath\fP refers to a block device. If the block device is in use by the system (e.g., mounted), \fBopen\fP() fails with the error \fBEBUSY\fP. .IP Sur les systèmes de fichiers NFS, \fBO_EXCL\fP n'est pris en charge qu'avec la version NFSv3 ou ultérieure, sur les noyaux 2.6 ou plus récents. Dans les environnements NFS où la prise en charge d'\fBO_EXCL\fP n'est pas fournie, les programmes qui ont besoin de cette fonctionnalité pour verrouiller des tâches risquent de rencontrer une concurrence critique (race condition). Les programmes portables qui veulent effectuer un verrouillage atomique de fichier en utilisant un fichier verrou et qui doivent éviter la dépendance de la prise en charge NFS pour \fBO_EXCL\fP peuvent créer un fichier unique sur le même système de fichiers (par exemple, avec le PID et le nom de l'hôte), et utiliser \fBlink\fP(2) pour créer un lien sur un fichier de verrouillage. Si \fBlink\fP(2) renvoie \fB0\fP, le verrouillage est réussi. Sinon, utiliser \fBstat\fP(2) sur ce fichier unique pour vérifier si le nombre de liens a augmenté jusqu'à 2, auquel cas le verrouillage est également réussi. .TP \fBO_LARGEFILE\fP (LFS) Permettre d'ouvrir des fichiers dont la taille ne peut pas être représentée dans un \fIoff_t\fP (mais peut l'être dans un \fIoff64_t\fP). La macro \fB_LARGEFILE64_SOURCE\fP doit être définie (avant d'inclure \fItout\fP fichier d'en\(hytête) pour obtenir cette définition. Définir la macro \fB_FILE_OFFSET_BITS\fP à 64 est la méthode à favoriser pour accéder à des grands fichiers sur des systèmes 32 bits, plutôt que d'utiliser \fBO_LARGEFILE\fP (consultez \fBfeature_test_macros\fP(7)). .TP \fBO_NOATIME\fP (depuis Linux 2.6.8) Ne pas mettre à jour la date de dernier accès au fichier ((\fIst_atime\fP dans l'inœud) quand le fichier est \fBread\fP(2). .IP Cet attribut ne peut être utilisé que si l'une des conditions suivantes est vraie : .RS .IP \- 3 .\" Strictly speaking: the filesystem UID L'identifiant utilisateur effectif du fichier correspond à celui du propriétaire du fichier. .IP \- Le processus appelant a la capacité \fBCAP_FOWNER\fP dans son espace de noms utilisateur et l'identifiant utilisateur du propriétaire du fichier a une projection dans l'espace de noms. .RE .IP .\" The O_NOATIME flag also affects the treatment of st_atime .\" by mmap() and readdir(2), MTK, Dec 04. Cet attribut est seulement conçu pour les programmes d'indexation et d'archivage, pour lesquels il peut réduire significativement l'activité du disque. L'attribut peut ne pas être effectif sur tous les systèmes de fichiers. Par exemple, avec NFS, l'heure d'accès est mise à jour par le serveur. .TP \fBO_NOCTTY\fP If \fIpath\fP refers to a terminal device\[em]see \fBtty\fP(4)\[em]it will not become the process's controlling terminal even if the process does not have one. .TP \fBO_NOFOLLOW\fP If the trailing component (i.e., basename) of \fIpath\fP is a symbolic link, then the open fails, with the error \fBELOOP\fP. Symbolic links in earlier components of the pathname will still be followed. (Note that the \fBELOOP\fP error that can occur in this case is indistinguishable from the case where an open fails because there are too many symbolic links found while resolving components in the path prefix of the pathname.) .IP Cet attribut est une extension FreeBSD qui a été ajoutée dans Linux 2.1.126, puis normalisée dans POSIX.1\-2008. .IP .\" The headers from glibc 2.0.100 and later include a .\" definition of this flag; \f[I]kernels before Linux 2.1.126 will ignore it if .\" used\f[]. Voir aussi \fBO_PATH\fP ci\-dessous. .TP \fBO_NONBLOCK\fP ou \fBO_NDELAY\fP Si possible, le fichier est ouvert en mode «\ non\-bloquant\ ». Ni la fonction \fBopen\fP() ni aucune autre opération d'E/S ultérieure sur le descripteur de fichier renvoyé ne laissera le processus appelant en attente. .IP Remarquez que positionner cet attribut n'a pas d'effet sur une opération \fBpoll\fP(2), \fBselect\fP(2), \fBepoll\fP(7) et équivalentes, puisque ces interfaces informent simplement l'appelant si un descripteur de fichier est « ready », à savoir qu'une opération E/S effectuée sur le descripteur de fichier avec l'attribut \fBO_NONBLOCK\fP \fIclear\fP ne se bloquerait pas. .IP Remarquez que cet attribut n'a aucun effet sur les fichiers ordinaires et les périphériques de bloc ; c'est\-à\-dire que les opérations d'E/S se bloqueront (brièvement) lorsqu’une activité du périphérique est nécessaire, indépendamment du positionnement de \fBO_NONBLOCK\fP. Comme la sémantique de \fBO_NONBLOCK\fP pourrait éventuellement être implémentée, les applications ne doivent pas dépendre d'un blocage comportemental quand elles indiquent cet attribut pour des fichiers ordinaires et des périphériques de bloc. .IP Pour la manipulation des FIFO (tubes nommés), voir également \fBfifo\fP(7). Pour une explication de l'effet de \fBO_NONBLOCK\fP en conjonction avec les verrouillages impératifs et les baux de fichiers, voir \fBfcntl\fP(2). .TP \fBO_PATH\fP (depuis Linux 2.6.39) .\" commit 1abf0c718f15a56a0a435588d1b104c7a37dc9bd .\" commit 326be7b484843988afe57566b627fb7a70beac56 .\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d .\" .\" http://thread.gmane.org/gmane.linux.man/2790/focus=3496 .\" Subject: Re: [PATCH] open(2): document O_PATH .\" Newsgroups: gmane.linux.man, gmane.linux.kernel .\" Obtenir un descripteur de fichier qui peut être utile de deux façons : pour indiquer la localisation dans l'arborescence du système de fichiers et pour effectuer des opérations exclusivement au niveau du descripteur de fichier. Le fichier n'est pas lui\-même ouvert et d'autres opérations sur le fichier (par exemple \fBread\fP(2), \fBwrite\fP(2), \fBfchmod\fP(2), \fBfchown\fP(2), \fBfgetxattr\fP(2), \fBioctl\fP(2), \fBmmap\fP(2)) échoueront en renvoyant l'erreur \fBEBADF\fP. .IP Les opérations suivantes \fIpeuvent\fP être réalisées sur le descripteur de fichier obtenu : .RS .IP \- 3 \fBclose\fP(2). .IP \- .\" commit 332a2e1244bd08b9e3ecd378028513396a004a24 \fBfchdir\fP(2), si le descripteur de fichier renvoie à un répertoire (depuis Linux 3.5). .IP \- \fBfstat\fP(2) (depuis Linux 3.6) .IP \- .\" fstat(): commit 55815f70147dcfa3ead5738fd56d3574e2e3c1c2 .\" fstatfs(): commit 9d05746e7b16d8565dddbe3200faa1e669d23bbf \fBfstatfs\fP(2) (depuis Linux 3.12) .IP \- Dupliquer le descripteur de fichier (\fBdup\fP(2), \fBfcntl\fP(2), \fBF_DUPFD\fP, etc.). .IP \- Consulter et affecter les valeurs des attributs du descripteur de fichier (\fBfcntl\fP(2), \fBF_GETFD\fP et \fBF_SETFD\fP). .IP \- Récupérer les attributs d'état de fichiers ouverts au moyen de l'opération \fBfcntl\fP(2) \fBF_GETFL\fP : les attributs renvoyés comprendront le bit \fBO_PATH\fP. .IP \- Transmettre le descripteur de fichier comme l'argument \fIdirfd\fP de \fBopenat\fP(2) et les autres appels système « *at() ». Cela comprend \fBlinkat\fP(2) avec \fBAT_EMPTY_PATH\fP (ou via procfs au moyen de \fBAT_SYMLINK_FOLLOW\fP) même si le fichier n'est pas un répertoire. .IP \- Transmettre le descripteur de fichier à un autre processus à l’aide d’un socket de domaine UNIX (consultez \fBSCM_RIGHTS\fP dans \fBunix\fP(7)). .RE .IP Lorsque \fBO_PATH\fP est précisé dans \fIflags\fP, seuls les bits \fBO_CLOEXEC\fP, \fBO_DIRECTORY\fP et \fBO_NOFOLLOW\fP de l'attribut sont pris en compte. .IP L'ouverture d'un fichier ou d'un répertoire avec l'attribut \fBO_PATH\fP ne nécessite pas de droits sur l'objet lui\-même (mais elle exige le droit d'exécution sur les répertoires du préfixe de chemin). En fonction des opérations ultérieures, la vérification des droits du fichier adéquats peut se faire (par exemple \fBfchdir\fP(2) exige le droit d'exécution sur le répertoire auquel renvoie son argument de descripteur de fichier). Inversement, l'obtention de la référence à un objet de système de fichiers en l'ouvrant par l'attribut \fBO_RDONLY\fP exige que l'appelant ait le droit de lire l'objet même quand l'opération ultérieure (par exemple, \fBfchdir\fP(2), \fBfstat\fP(2)) n'a pas besoin des droits de lecture sur l'objet. .IP If \fIpath\fP is a symbolic link and the \fBO_NOFOLLOW\fP flag is also specified, then the call returns a file descriptor referring to the symbolic link. This file descriptor can be used as the \fIdirfd\fP argument in calls to \fBfchownat\fP(2), \fBfstatat\fP(2), \fBlinkat\fP(2), and \fBreadlinkat\fP(2) with an empty pathname to have the calls operate on the symbolic link. .IP If \fIpath\fP refers to an automount point that has not yet been triggered, so no other filesystem is mounted on it, then the call returns a file descriptor referring to the automount directory without triggering a mount. \fBfstatfs\fP(2) can then be used to determine if it is, in fact, an untriggered automount point (\fB.f_type == AUTOFS_SUPER_MAGIC\fP). .IP Une utilisation de \fBO_PATH\fP sur des fichiers ordinaires consiste à fournir l'équivalent de la fonctionnalité \fBO_EXEC\fP de POSIX.1. Cela nous permet d'ouvrir un fichier sur lequel on a le droit d'exécution mais pas de lecture, puis d'exécuter ce fichier selon des étapes comme suit : .IP .in +4n .EX char buf[PATH_MAX]; fd = open("un_programme", O_PATH); snprintf(buf, PATH_MAX, "/proc/self/fd/%d", fd); execl(buf, "un_programme", (char *) NULL); .EE .in .IP Un descripteur de fichier \fBO_PATH\fP peut également être fourni comme argument de \fBfexecve\fP(3). .TP \fBO_SYNC\fP Les opérations d'écriture dans le fichier se dérouleront selon les conditions d'exécution des opérations E/S synchrones avec garantie d'intégrité du \fIfichier\fP (contrairement à l'exécution des opérations E/S synchrones avec garantie d'intégrité des \fIdonnées\fP fournie par \fBO_DSYNC\fP.) .IP Au moment où \fBwrite\fP(2) (ou un appel similaire) renvoie une donnée, cette donnée et les métadonnées associées au fichier ont été transmises au matériel sur lequel s'exécute l'appel (autrement dit, comme si chaque appel à \fBwrite\fP(2) était suivi d'un appel à \fBfsync\fP(2)). \fIConsultez VERSIONS\fP. .TP \fBO_TMPFILE\fP (depuis Linux 3.11) .\" commit 60545d0d4610b02e55f65d141c95b18ccf855b6e .\" commit f4e0c30c191f87851c4a53454abb55ee276f4a7e .\" commit bb458c644a59dbba3a1fe59b27106c5e68e1c4bd Create an unnamed temporary regular file. The \fIpath\fP argument specifies a directory; an unnamed inode will be created in that directory's filesystem. Anything written to the resulting file will be lost when the last file descriptor is closed, unless the file is given a name. .IP \fBO_TMPFILE\fP doit être indiqué avec soit \fBO_RDWR\fP, soit \fBO_WRONLY\fP, et facultativement \fBO_EXCL\fP. Si \fBO_EXCL\fP n’est pas indiqué, alors \fBlinkat\fP(2) peut être utilisé pour lier le fichier temporaire dans le système de fichiers, le rendant permanent, en utilisant du code comme : .IP .in +4n .EX char path[PATH_MAX]; fd = open("/path/to/dir", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); \& /* File I/O on \[aq]fd\[aq]... */ \& linkat(fd, "", AT_FDCWD, "/path/for/file", AT_EMPTY_PATH); \& /* If the caller doesn\[aq]t have the CAP_DAC_READ_SEARCH capability (needed to use AT_EMPTY_PATH with linkat(2)), and there is a proc(5) filesystem mounted, then the linkat(2) call above can be replaced with: \& snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file", AT_SYMLINK_FOLLOW); */ .EE .in .IP Dans ce cas, l’argument \fImode\fP d’\fBopen\fP() détermine le mode de droits du fichier, comme avec \fBO_CREAT\fP. .IP Indiquer \fBO_EXCL\fP en conjonction avec \fBO_TMPFILE\fP empêche de lier un fichier temporaire dans le système de fichiers comme précédemment (remarquez que la signification de \fBO_EXCL\fP dans ce cas est différente de la signification habituelle de \fBO_EXCL\fP). .IP .\" Inspired by http://lwn.net/Articles/559147/ Les deux principaux cas d’utilisation de \fBO_TMPFILE\fP sont présentés ci\-dessous : .RS .IP \- 3 Améliorer la fonctionnalité \fBtmpfile\fP(3) : création de fichiers temporaires sans situation de compétition qui (1) sont automatiquement supprimés à la fermeture ; (2) ne peuvent jamais être atteints par n’importe quel chemin ; (3) ne sont pas exposés aux attaques de lien symbolique ; et (4) ne nécessitent pas à l’appelant d’inventer des noms uniques. .IP \- Créer un fichier initialement invisible, qui est ensuite peuplé de données et ajusté aux attributs de système de fichiers adéquats (\fBfchown\fP(2), \fBfchmod\fP(2), \fBfsetxattr\fP(2), etc.) avant d’être lié de façon atomique dans le système de fichiers dans un état complètement formé (en utilisant \fBlinkat\fP(2) comme décrit précédemment). .RE .IP .\" To check for support, grep for "tmpfile" in kernel sources .\" commit 99b6436bc29e4f10e4388c27a3e4810191cc4788 .\" commit ab29743117f9f4c22ac44c13c1647fb24fb2bafe .\" commit ef3b9af50bfa6a1f02cd7b3f5124b712b1ba3e3c .\" commit 50732df02eefb39ab414ef655979c2c9b64ad21c \fBO_TMPFILE\fP nécessite une prise en charge par le système de fichiers sous\-jacent. Seule une partie des systèmes de fichiers Linux fournit cette prise en charge. Dans l'implémentation initiale, la prise en charge était assurée pour les systèmes de fichiers ext2, ext3, ext4, UDF, Minix et tmpfs. La prise en charge d'autres systèmes de fichiers a ensuite été ajoutée ainsi : XFS (Linux 3.15) ; Btrfs (Linux 3.16) ; F2FS (Linux 3.16) ; et ubifs (Linux 4.9) .TP \fBO_TRUNC\fP Si le fichier existe, est un fichier ordinaire et que le mode d’accès permet l’écriture (\fBO_RDWR\fP ou \fBO_WRONLY\fP), il sera tronqué à une longueur nulle. Si le fichier est une FIFO ou un périphérique terminal, l'attribut \fBO_TRUNC\fP est ignoré. Sinon, le comportement de \fBO_TRUNC\fP n'est pas précisé. .SS creat() L'appel \fBcreat\fP() est équivalent à \fBopen\fP() avec l'attribut \fIflags\fP égal à \fBO_CREAT|O_WRONLY|O_TRUNC\fP. .SS openat() L'appel système \fBopenat\fP() fonctionne de la même façon que \fBopen\fP(), les différences étant décrites ici. .P The \fIdirfd\fP argument is used in conjunction with the \fIpath\fP argument as follows: .IP \- 3 If the pathname given in \fIpath\fP is absolute, then \fIdirfd\fP is ignored. .IP \- If the pathname given in \fIpath\fP is relative and \fIdirfd\fP is the special value \fBAT_FDCWD\fP, then \fIpath\fP is interpreted relative to the current working directory of the calling process (like \fBopen\fP()). .IP \- If the pathname given in \fIpath\fP is relative, then it is interpreted relative to the directory referred to by the file descriptor \fIdirfd\fP (rather than relative to the current working directory of the calling process, as is done by \fBopen\fP() for a relative pathname). In this case, \fIdirfd\fP must be a directory that was opened for reading (\fBO_RDONLY\fP) or using the \fBO_PATH\fP flag. .P .\" If the pathname given in \fIpath\fP is relative, and \fIdirfd\fP is not a valid file descriptor, an error (\fBEBADF\fP) results. (Specifying an invalid file descriptor number in \fIdirfd\fP can be used as a means to ensure that \fIpath\fP is absolute.) .SS openat2(2) L'appel système \fBopenat2\fP(2) est une extension de \fBopenat\fP() et il fournit un ensemble supplémentaire aux fonctionnalités de \fBopenat\fP(). Il est documenté à part dans \fBopenat2\fP(2). .SH "VALEUR RENVOYÉE" \fBopen\fP(), \fBopenat\fP() et \fBcreat\fP() renvoient le nouveau descripteur de fichier (un entier non négatif) s'ils réussissent. En cas d'erreur, ou \fB\-1\fP est renvoyé et \fIerrno\fP est défini pour indiquer l'erreur. .SH ERREURS \fBopen\fP(), \fBopenat\fP() et \fBcreat\fP() peuvent échouer avec les erreurs suivantes : .TP \fBEACCES\fP The requested access to the file is not allowed, or search permission is denied for one of the directories in the path prefix of \fIpath\fP, or the file did not exist yet and write access to the parent directory is not allowed. (See also \fBpath_resolution\fP(7).) .TP \fBEACCES\fP .\" commit 30aba6656f61ed44cba445a3c0d38b296fa9e8f5 Lorsque \fBO_CREAT\fP est indiqué, le systcl \fIprotected_fifos\fP ou \fIprotected_regular\fP est activé, le fichier existe déjà ou est une FIFO ou un fichier ordinaire, le propriétaire du fichier n'est ni l'utilisateur actuel, ni celui du répertoire qui le contient, et ce répertoire est accessible en écriture et en exécution pour tout le monde. Pour plus de détails, consultez les descriptions de \fI/proc/sys/fs/protected_fifos\fP et de \fI/proc/sys/fs/protected_regular\fP dans \fBproc_sys_fs\fP(5). .TP \fBEBADF\fP (\fBopenat\fP()) \fIpath\fP is relative but \fIdirfd\fP is neither \fBAT_FDCWD\fP nor a valid file descriptor. .TP \fBEBUSY\fP \fBO_EXCL\fP was specified in \fIflags\fP and \fIpath\fP refers to a block device that is in use by the system (e.g., it is mounted). .TP \fBEDQUOT\fP Si \fBO_CREAT\fP est indiqué, le fichier n'existe pas et le quota de blocs de disque ou d'inœuds de l'utilisateur sur le système de fichiers a été atteint. .TP \fBEEXIST\fP \fIpath\fP already exists and \fBO_CREAT\fP and \fBO_EXCL\fP were used. .TP \fBEFAULT\fP \fIpath\fP pointe en dehors de l'espace d'adressage accessible. .TP \fBEFBIG\fP Consultez \fBEOVERFLOW\fP. .TP \fBEINTR\fP Pendant qu'il était bloqué en attente de l'ouverture d'un périphérique lent (par exemple, une FIFO ; consultez \fBfifo\fP(7)), l'appel a été interrompu par un gestionnaire de signal ; consultez \fBsignal\fP(7). .TP \fBEINVAL\fP Le système de fichiers ne gère pas l’attribut \fBO_DIRECT\fP. Consultez \fBNOTES\fP pour de plus amples renseignements. .TP \fBEINVAL\fP .\" In particular, __O_TMPFILE instead of O_TMPFILE Valeur incorrecte dans \fIflags\fP. .TP \fBEINVAL\fP \fBO_TMPFILE\fP a été indiqué dans \fIflags\fP, mais ni \fBO_WRONLY\fP ni \fBO_RDWR\fP n’ont été indiqués. .TP \fBEINVAL\fP \fBO_CREAT\fP and \fBO_DIRECTORY\fP were both specified in \fIflags ,\fP and the Linux kernel version is 6.4 or later. (Earlier kernels were inconsistent in this area, and POSIX does not specify the behavior.) .TP \fBEINVAL\fP \fBO_CREAT\fP was specified in \fIflags\fP and the final component ("basename") of the new file's \fIpath\fP is invalid (e.g., it contains characters not permitted by the underlying filesystem). .TP \fBEINVAL\fP The final component ("basename") of \fIpath\fP is invalid (e.g., it contains characters not permitted by the underlying filesystem). .TP \fBEISDIR\fP \fIpath\fP refers to a directory and the access requested involved writing (that is, \fBO_WRONLY\fP or \fBO_RDWR\fP is set). .TP \fBEISDIR\fP \fIpath\fP refers to an existing directory, \fBO_TMPFILE\fP and one of \fBO_WRONLY\fP or \fBO_RDWR\fP were specified in \fIflags\fP, but this kernel version does not provide the \fBO_TMPFILE\fP functionality. .TP \fBELOOP\fP \fIpath\fP contient une référence circulaire (à travers un lien symbolique) .TP \fBELOOP\fP \fIpath\fP was a symbolic link, and \fIflags\fP specified \fBO_NOFOLLOW\fP but not \fBO_PATH\fP. .TP \fBEMFILE\fP La limite par processus du nombre de descripteurs de fichiers ouverts a été atteinte (voir la description de \fBRLIMIT_NOFILE\fP dans \fBgetrlimit\fP(2)). .TP \fBENAMETOOLONG\fP \fIpath\fP était trop long. .TP \fBENFILE\fP La limite du nombre total de fichiers ouverts pour le système entier a été atteinte. .TP \fBENODEV\fP \fIpath\fP refers to a device special file and no corresponding device exists. (This is a Linux kernel bug; in this situation \fBENXIO\fP must be returned.) .TP \fBENOENT\fP \fBO_CREAT\fP n'est pas positionné et le fichier nommé n'existe pas. .TP \fBENOENT\fP Un des répertoires du chemin d'accès \fIchemin\fP n'existe pas ou est un lien symbolique pointant nulle part. .TP \fBENOENT\fP \fIpath\fP refers to a nonexistent directory, \fBO_TMPFILE\fP and one of \fBO_WRONLY\fP or \fBO_RDWR\fP were specified in \fIflags\fP, but this kernel version does not provide the \fBO_TMPFILE\fP functionality. .TP \fBENOMEM\fP Le fichier nommé est une FIFO, mais la mémoire du tampon de la FIFO ne peut pas être allouée car la limite dure par processus d'allocation de mémoire pour des tubes (pipes) a été atteinte et l'appelant n'est pas privilégié ; voir \fBpipe\fP(7). .TP \fBENOMEM\fP La mémoire disponible du noyau n'était pas suffisante. .TP \fBENOSPC\fP \fIpath\fP was to be created but the device containing \fIpath\fP has no room for the new file. .TP \fBENOTDIR\fP A component used as a directory in \fIpath\fP is not, in fact, a directory, or \fBO_DIRECTORY\fP was specified and \fIpath\fP was not a directory. .TP \fBENOTDIR\fP (\fBopenat\fP()) \fIpath\fP is a relative pathname and \fIdirfd\fP is a file descriptor referring to a file other than a directory. .TP \fBENXIO\fP \fBO_NONBLOCK\fP | \fBO_WRONLY\fP est positionné, le fichier nommé est une FIFO et le processus n'a pas cette FIFO ouverte en lecture. .TP \fBENXIO\fP Le fichier est un fichier spécial de périphérique et il n'existe aucun périphérique correspondant. .TP \fBENXIO\fP Le fichier est un socket de domaine UNIX. .TP \fBEOPNOTSUPP\fP The filesystem containing \fIpath\fP does not support \fBO_TMPFILE\fP. .TP \fBEOVERFLOW\fP .\" See http://bugzilla.kernel.org/show_bug.cgi?id=7253 .\" "Open of a large file on 32-bit fails with EFBIG, should be EOVERFLOW" .\" Reported 2006-10-03 \fIpath\fP refers to a regular file that is too large to be opened. The usual scenario here is that an application compiled on a 32\-bit platform without \fI\-D_FILE_OFFSET_BITS=64\fP tried to open a file whose size exceeds \fI(1<<31)\-1\fP bytes; see also \fBO_LARGEFILE\fP above. This is the error specified by POSIX.1; before Linux 2.6.24, Linux gave the error \fBEFBIG\fP for this case. .TP \fBEPERM\fP .\" Strictly speaking, it's the filesystem UID... (MTK) L'attribut \fBO_NOATIME\fP est indiqué, mais l'UID effectif de l'appelant n'est pas celui du propriétaire du fichier, et l'appelant n'est pas privilégié. .TP \fBEPERM\fP La lecture a été interrompue par un signal ; consultez \fBfnctl\fP(2). .TP \fBEROFS\fP \fIpath\fP refers to a file on a read\-only filesystem and write access was requested. .TP \fBETXTBSY\fP \fIpath\fP refers to an executable image which is currently being executed and write access was requested. .TP \fBETXTBSY\fP \fIpath\fP refers to a file that is currently in use as a swap file, and the \fBO_TRUNC\fP flag was specified. .TP \fBETXTBSY\fP \fIpath\fP refers to a file that is currently being read by the kernel (e.g., for module/firmware loading), and write access was requested. .TP \fBEWOULDBLOCK\fP L'attribut \fBO_NONBLOCK\fP est indiqué, et un bail incompatible est détenu sur le fichier (consultez \fBfcntl\fP(2)). .SH VERSIONS .\" Linux 2.0, 2.5: truncate .\" Solaris 5.7, 5.8: truncate .\" Irix 6.5: truncate .\" Tru64 5.1B: truncate .\" HP-UX 11.22: truncate .\" FreeBSD 4.7: truncate L'effet (indéfini) de \fBO_RDONLY | O_TRUNC\fP varie selon l'implémentation. Sur de nombreux systèmes, le fichier est effectivement tronqué. .SS "E/S synchrones" L'option POSIX\-1.2008 « E/S synchrones » décrit des variantes des E/S synchrones, ainsi que plusieurs attributs de \fBopen\fP() permettant d'en contrôler le comportement : \fBO_SYNC\fP, \fBO_DSYNC\fP et \fBO_RSYNC\fP. Sans chercher à savoir si une implémentation accepte cette option, elle doit au moins prendre en charge l'utilisation de \fBO_SYNC\fP pour les fichiers normaux. .P Linux met en œuvre \fBO_SYNC\fP et \fBO_DSYNC\fP, mais pas \fBO_RSYNC\fP. De façon plus ou moins correcte, la glibc définit \fBO_RSYNC\fP de façon à avoir la même valeur que \fBO_SYNC\fP. (\fBO_RSYNC\fP est défini dans le fichier d'en\-tête du noyau Linux \fI\fP de HP PA\-RISC, mais il n'est pas utilisé). .P \fBO_SYNC\fP fournit l'exécution d'E/S synchrones avec garantie d'intégrité des \fIfichiers\fP, ce qui signifie que les opérations d'écriture envoient les données et les métadonnées associées au matériel. \fBO_DSYNC\fP fournit l'exécution d'E/S synchrones avec garantie d'intégrité des \fIdonnées\fP, ce qui signifie que les opérations d'écriture envoient les données et les métadonnées associées au matériel, mais en envoyant seulement les mises à jour des métadonnées qui permettent d'assurer le bon déroulement d'une opération de lecture ultérieure. L'exécution avec garantie d'intégrité des données peut réduire le nombre d'accès au disque demandés par une application qui ne nécessite pas l'exécution avec garantie d'intégrité des fichiers. .P Pour comprendre la différence entre ces deux types d'exécution, imaginez deux extraits de métadonnées d'un fichier : l'horodatage de la dernière modification (\fIst_mtime\fP) et la longueur du fichier. Toutes les opérations d'écriture modifieront l'horodatage de la dernière modification, mais seules les écritures en fin de fichier modifieront la longueur. L'horodatage de dernière modification n'est pas nécessaire pour garantir une lecture correcte du fichier, contrairement à la longueur. Ainsi, \fBO_DSYNC\fP transmettrait seulement la métadonnée relative à la longueur du fichier (quand \fBO_SYNC\fP y ajouterait l'horodatage de dernière modification). .P Avant Linux 2.6.33, Linux mettait seulement en œuvre l'attribut \fBO_SYNC\fP de \fBopen\fP(). Cependant, lorsque cet attribut était indiqué, la plupart des systèmes de fichiers fournissait des fonctionnalités équivalentes à l'exécution des E/S synchrones avec garantie de l'intégrité des \fIdonnées\fP (autrement dit, \fBO_SYNC\fP était de fait mis en œuvre comme \fBO_DSYNC\fP). .P .\" A partir de Linux 2.6.33, une véritable prise de charge de \fBO_SYNC\fP est fournie. Cependant, pour assurer la compatibilité ascendante binaire, \fBO_DSYNC\fP a été défini avec la même valeur que le \fBO_SYNC\fP « historique », et \fBO_SYNC\fP a été défini comme un nouvel attribut (de deux bits) qui comprend l'attribut \fBO_DSYNC\fP. Ceci permet d'assurer que les applications compilées avec les nouveaux en\-têtes auront au moins la sémantique de \fBO_DSYNC\fP avant Linux 2.6.33. .SS "Différences entre bibliothèque C et noyau" .\" Depuis la glibc 2.26, la fonction enveloppe de la glibc de \fBopen\fP() utilise l'appel système \fBopenat\fP() au lieu de l'appel système \fBopen\fP() du noyau. Pour certaines architectures, cela est aussi vrai avant la glibc 2.26. .SS POSIX POSIX.1\-2024 specifies \fBO_CLOFORK\fP, but Linux doesn't support it. .SH NORMES .TP \fBopen\fP() .TQ \fBcreat\fP() .TQ \fBopenat\fP() POSIX.1\-2024. .TP \fBopenat2\fP(2) Linux. .TP \fBO_DIRECT\fP .TQ \fBO_NOATIME\fP .TQ \fBO_PATH\fP .TQ \fBO_TMPFILE\fP Linux. .SH HISTORIQUE .TP \fBopen\fP() .TQ \fBcreat\fP() SVr4, 4.3BSD, POSIX.1\-2001. .TP \fBopenat\fP() POSIX.1\-2008. Linux 2.6.16, glibc 2.4. .TP \fBO_CLOEXEC\fP .TQ \fBO_DIRECTORY\fP .TQ \fBO_NOFOLLOW\fP POSIX.1\-2008. .SH NOTES Sous Linux, l'attribut \fBO_NONBLOCK\fP est parfois utilisé pour indiquer qu'on veut ouvrir mais pas nécessairement dans l'intention de lire ou d'écrire. Il est typiquement utilisé pour ouvrir des périphériques dans le but de récupérer un descripteur de fichier pour l'utiliser avec \fBioctl\fP(2). .P Notez que \fBopen\fP() peut ouvrir des fichiers spéciaux mais \fBcreat\fP() ne peut pas en créer, il faut utiliser \fBmknod\fP(2) à la place. .P Si un fichier est créé, ses horodatages \fIst_atime\fP, \fIst_ctime\fP, \fIst_mtime\fP (respectivement heure de dernier accès, de dernière modification d'état, et de dernière modification\ ; consultez \fBstat\fP(2)) sont définis à l'heure actuelle, ainsi que les champs \fIst_ctime\fP et \fIst_mtime\fP du répertoire parent. Sinon, si le fichier est modifié à cause de l'attribut \fBO_TRUNC\fP, ses champs \fIst_ctime\fP et \fIst_mtime\fP sont remplis avec l'heure actuelle. .P Les fichiers du répertoire \fI/proc/\fPpid\fI/fd\fP affichent les descripteurs de fichier ouverts du processus ayant l'identifiant \fIpid\fP. Les fichiers du répertoire \fI/proc/\fPpid\fI/fdinfo\fP présentent encore plus d'informations sur ces descripteurs de fichier. Voir \fBproc\fP(5) pour plus de détails sur ces deux répertoires. .P .\" .\" Le fichier d'en\-tête \fB\fP du noyau Linux ne définit pas \fBO_ASYNC\fP ; son synonyme \fBFASYNC\fP (dérivé de BSD) l'est en revanche. .SS "Description de fichier ouvert" Le terme « description de fichier ouvert » correspond à la terminologie POSIX pour faire référence à des entrées dans la table des fichiers ouverts du système. Dans d'autres contextes, cet objet est également appelé « objet de fichier ouvert », « gestionnaire de fichier », « entrée de la table des fichiers ouverts » ou encore, dans le jargon des développeurs du noyau, \fIstruct file\fP. .P Lorsqu'un descripteur de fichiers est dupliqué (au moyen de \fBdup\fP(2) ou d'un équivalent), la copie fait référence à la même description de fichier ouvert que le descripteur de fichier d'origine. Les deux descripteurs de fichier partagent donc la même position dans le fichier et les mêmes attributs d'état. Un tel partage peut également se produire entre deux processus : un processus enfant créé au moyen de \fBfork\fP(2) hérite des copies des descripteurs de fichier de ses parents, et ces copies pointent vers les mêmes descriptions de fichier ouvert. .P Chaque opération \fBopen\fP(2) sur un fichier crée une nouvelle description de fichier ouvert ; ainsi, il peut y avoir plusieurs descriptions de fichier ouvert correspondant à un inœud de fichier. .P .\" Sur Linux, on peut utiliser \fBKCMP_FILE\fP de \fBkcmp\fP(2) pour tester si deux descripteurs de fichier (dans le même processus ou dans deux processus différents) se rapportent à la même description de fichier ouvert. .SS NFS Plusieurs problèmes se posent avec le protocole NFS, concernant entre autres \fBO_SYNC\fP, et \fBO_NDELAY\fP. .P .\" .\" Sur les systèmes de fichiers NFS, où la correspondance d'UID est activée, \fBopen\fP() peut renvoyer un descripteur de fichier alors qu'une requête \fBread\fP(2) par exemple sera refusée avec le code d'erreur \fBEACCES\fP. En effet, le client a effectué \fBopen\fP() en vérifiant les autorisations d'accès, mais la correspondance d'UID est calculée par le serveur au moment des requêtes de lecture ou d'écriture. .SS FIFO .\" .\" Ouvrir les blocs de fin de FIFO en lecture et écriture jusqu'à ce que l'autre fin soit également ouverte (par un autre processus ou un autre thread). Voir \fBfifo\fP(7) pour plus de détails. .SS "Mode d’accès au fichier" Contrairement aux autres valeurs qui peuvent être indiquées dans \fIflags\fP, les valeurs du \fImode d'accès\fP \fBO_RDONLY\fP, \fBO_WRONLY\fP et \fBO_RDWR\fP ne sont pas des bits individuels. Ils définissent l'ordre des deux bits de poids faible de \fIflags\fP, et ont pour valeur respective 0, 1 et 2. En d'autres termes, l'association \fBO_RDONLY | O_WRONLY\fP est une erreur logique et n'a certainement pas la même signification que \fBO_RDWR\fP. .P .\" See for example util-linux's disk-utils/setfdprm.c .\" For some background on access mode 3, see .\" http://thread.gmane.org/gmane.linux.kernel/653123 .\" "[RFC] correct flags to f_mode conversion in __dentry_open" .\" LKML, 12 Mar 2008 .\" .\" Linux réserve le sens suivant au mode 3 d'accès spécial et non standard (en binaire, 11) de l'attribut : vérification des droits en lecture et écriture du fichier, et renvoi d'un descripteur qui ne peut être utilisé ni en lecture, ni en écriture. Ce mode d'accès non standard est utilisé par certains pilotes Linux afin de renvoyer un descripteur qui n'est destiné qu'à des opérations \fBioctl\fP(2) propres aux périphériques. .SS "Justification des appels openat() et des API des descripteurs de fichier de répertoires" \fBopenat\fP() et les autres appels système similaires, ainsi que les fonctions de bibliothèques qui reçoivent pour argument un descripteur de fichier de répertoire (c'est\-à\-dire, \fBexecveat\fP(2), \fBfaccessat\fP(2), \fBfanotify_mark\fP(2), \fBfchmodat\fP(2), \fBfchownat\fP(2), \fBfspick\fP(2), \fBfstatat\fP(2), \fBfutimesat\fP(2), \fBlinkat\fP(2), \fBmkdirat\fP(2), \fBmknodat\fP(2), \fBmount_setattr\fP(2), \fBmove_mount\fP(2), \fBname_to_handle_at\fP(2), \fBopen_tree\fP(2), \fBopenat2\fP(2), \fBreadlinkat\fP(2), \fBrenameat\fP(2), \fBrenameat2\fP(2), \fBstatx\fP(2), \fBsymlinkat\fP(2), \fBunlinkat\fP(2), \fButimensat\fP(2), \fBmkfifoat\fP(3) et \fBscandirat\fP(3)) gèrent deux problèmes avec les anciennes interfaces. L'explication est ici donnée dans le contexte de l'appel \fBopenat\fP(), mais elle est semblable pour les autres interfaces. .P Tout d'abord, \fBopenat\fP() permet à une application d'éviter les problèmes d'accès concurrents lors de l'utilisation de \fBopen\fP() pour ouvrir des fichiers dans des répertoires autres que le répertoire courant. Ces problèmes sont dus au fait que l'un des composants du chemin donné à \fBopen\fP() peut être modifié parallèlement à l'appel \fBopen\fP(). Supposons par exemple qu'on veuille créer le fichier \fIdir1/dir2/xxx.dep\fP alors que le fichier \fIdir1/dir2/xxx\fP existe. Le problème est qu'entre la vérification de son existence et l'étape de création du fichier, \fIdir1\fP ou \fIdir2\fP (qui pourraient être des liens symboliques) pourraient être modifiés pour pointer vers un autre endroit. De tels problèmes peuvent être évités en ouvrant un descripteur de fichier sur le répertoire cible, puis en fournissant ce descripteur comme argument \fIdirfd\fP de (disons) \fBfstatat\fP(2) et \fBopenat\fP(). L'utilisation du descripteur de fichier \fIdirfd\fP a également d'autres avantages : .IP \- 3 le descripteur de fichier est une référence stable au répertoire, même si le répertoire est renommé ; .IP \- le descripteur de fichier ouvert empêche le système de fichiers sous\-jacent d'être démonté quand un processus détient un répertoire en cours de fonctionnement sur le système de fichiers. .P Enfin, \fBopenat\fP() permet d'implémenter un «\ répertoire courant\ » par thread, grâce à des descripteurs de fichier maintenus par l'application. Cette fonctionnalité peut également être obtenue en jouant avec \fI/proc/self/fd/\fPdirfd, mais de façon moins efficace. .P L'argument \fIdirfd\fP de ces API peut être obtenu par l'utilisation de \fBopen\fP() ou de \fBopenat\fP() pour ouvrir un répertoire (avec le drapeau \fBO_RDONLY\fP ou \fBO_PATH\fP). Sinon, un tel descripteur de fichier peut être obtenu en appliquant un \fBdirfd\fP(3) au flux d'un répertoire créé avec \fBopendir\fP(3). .P .\" .\" Quand on donne aux API un argument \fIdirfd\fP de \fBAT_FDCWD\fP ou qu'un chemin indiqué est absolu, ils gèrent leur argument de chemin de la même manière que les API conventionnelles correspondantes. Toutefois dans ce cas, plusieurs API ont un argument \fIflags\fP qui offre un accès à cette fonctionnalité non disponible avec les interfaces conventionnelles correspondantes. .SS O_DIRECT L'attribut \fBO_DIRECT\fP peut imposer des restrictions d'alignement pour la longueur et l'adresse des tampons de l'espace utilisateur et des décalages de fichier pour les entrées\-sorties. Sous Linux, les restrictions d'alignement varient en fonction du système de fichiers et de la version du noyau, et il peut aussi ne pas y en avoir. La manipulation des entrées\-sorties \fBO_DIRECT\fP mal alignées varie aussi ; elles peuvent soit échouer avec l'erreur \fBEINVAL\fP soit se replier sur des entrées\-sorties mises en tampon. .P Depuis Linux 6.1, la prise en charge de \fBO_DIRECT\fP et les restrictions d'alignement pour un fichier peuvent être recherchées avec \fBstatx\fP(2) en utilisant l'attribut \fBSTATX_DIOALIGN\fP. La prise en charge de \fBSTATX_DIOALIGN\fP varie selon le système de fichiers ; consultez \fBstatx\fP(2). .P Certains systèmes de fichiers fournissent leur propre interface pour rechercher les restrictions d'alignement de \fBO_DIRECT\fP, par exemple l'opération \fBXFS_IOC_DIOINFO\fP de \fBxfsctl\fP(3). \fBSTATX_DIOALIGN\fP devrait être utilisé à la place quand il est disponible. .P Si aucun de ces interfaces n'est disponible, alors la prise en charge directe des entrées\-sorties et les restrictions d'alignement peuvent uniquement être présumées à partir des caractéristiques connues du système de fichiers, du fichier individuel, des périphériques de stockage sous\-jacents et de la version du noyau. Dans Linux 2.4, la plupart des systèmes de fichiers basés sur des périphériques bloc requièrent que l'adresse du fichier et la longueur et l'adresse mémoire de tous les segments d'entrées\-sorties soient des multiples de la taille de bloc du système de fichiers (habituellement 4096 octets). Dans Linux 2.6.0, cela a été assoupli à la taille du bloc logique du périphérique bloc (habituellement 512 octets). La taille de bloc logique d'un périphérique bloc peut être déterminée avec l'opération \fBBLKSSZGET\fP de \fBioctl\fP(2) ou avec la commande shell suivante : .P .in +4n .EX blockdev \-\-getss .EE .in .P Les E/S \fBO_DIRECT\fP ne devraient jamais être exécutées en même temps que l'appel système \fBfork\fP(2), si le tampon mémoire est une projection privée (c'est\-à\-dire n'importe quelle projection en mémoire créée avec l'attribut \fBMAP_PRIVATE\fP de \fBmmap\fP(2), y compris la mémoire allouée sur le tas et les tampons alloués de façon statique). Toutes ces E/S, qu'elles soient soumises par l'intermédiaire d'une interface d'E/S asynchrone ou depuis un autre thread du processus, devraient être achevées avant l'appel de \fBfork\fP(2). En cas d'échec, les conséquences pourraient être une corruption de mémoire ou un comportement imprévisible dans les processus père et fils. Cette restriction ne s'applique pas quand le tampon mémoire pour les E/S \fBO_DIRECT\fP a été créé en utilisant \fBshmat\fP(2) ou \fBmmap\fP(2) avec l'attribut \fBMAP_SHARED\fP. Cette restriction ne s'applique pas non plus quand le tampon mémoire a été configuré comme \fBMADV_DONTFORK\fP avec \fBmadvise\fP(2), en s'assurant qu'il ne sera pas disponible au fils après \fBfork\fP(2). .P L'attribut \fBO_DIRECT\fP a été introduit par SGI IRIX, qui a des restrictions d'alignement identiques à Linux 2.4. IRIX a aussi un appel \fBfcntl\fP(2) pour obtenir les alignements et tailles appropriés. FreeBSD 4.x a introduit un attribut du même nom, mais sans les restrictions d'alignement. .P La gestion de \fBO_DIRECT\fP a été ajoutée dans Linux 2.4.10. Les noyaux Linux plus anciens ignorent simplement cet attribut. Certains systèmes de fichiers peuvent ne pas gérer cet attribut et \fBopen\fP() échouera avec l'erreur \fBEINVAL\fP s'il est utilisé. .P Les applications devraient éviter de mélanger des entrées\-sorties \fBO_DIRECT\fP et normales pour le même fichier, en particulier sur des régions d'un même fichier qui se recouvrent. Même si le système de fichiers gère les problèmes de cohérence dans cette situation, le débit global d'entrées\-sorties sera moindre que si un seul mode était utilisé. De la même façon, les applications devraient éviter de mélanger l'utilisation de \fBmmap\fP(2) et d'entrées\-sorties directes pour les mêmes fichiers. .P Le comportement de \fBO_DIRECT\fP avec NFS diffère des systèmes de fichiers locaux. Les anciens noyaux, ou les noyaux configurés d'une certaine façon, peuvent ne pas gérer cette combinaison. Le protocole NFS ne gère pas le passage de l'attribut au serveur, les entrées\-sorties \fBO_DIRECT\fP ne font donc que le cache des pages du client ; le serveur pourra toujours utiliser un cache pour les entrées\-sorties. Le client demande au serveur de rendre les entrées\-sorties synchrones pour préserver la sémantique synchrone de \fBO_DIRECT\fP. Certains serveurs fonctionnent mal dans ces circonstances, tout particulièrement si les entrées\-sorties sont de petite taille. Certains serveurs peuvent aussi être configurés pour mentir aux clients et indiquer que les entrées\-sorties ont atteint un espace de stockage stable ; ceci évitera la perte de performance en augmentant les risques pour l'intégrité des données en cas de problème d'alimentation du serveur. Le client NFS Linux n'a pas de restriction d'alignement pour les entrées\-sorties \fBO_DIRECT\fP. .P En résumé, \fBO_DIRECT\fP est un outil potentiellement puissant qui doit être utilisé avec précaution. Les applications devraient utiliser \fBO_DIRECT\fP comme une option pour améliorer les performances et qui est désactivée par défaut. .SH BOGUES .\" FIXME . Check bugzilla report on open(O_ASYNC) .\" See http://bugzilla.kernel.org/show_bug.cgi?id=5993 Actuellement, il n'est pas possible d'activer les entrées\-sorties contrôlées par les signaux en indiquant \fBO_ASYNC\fP lors de l'appel \fBopen\fP()\ ; il faut utiliser \fBfcntl\fP(2) pour activer cet attribut. .P Deux codes d’erreur différents – \fBEISDIR\fP et \fBENOENT\fP — doivent être vérifiés pour essayer de déterminer si le noyau prend en charge la fonctionnalité \fBO_TMPFILE\fP. .SH "VOIR AUSSI" \fBchmod\fP(2), \fBchown\fP(2), \fBclose\fP(2), \fBdup\fP(2), \fBfcntl\fP(2), \fBlink\fP(2), \fBlseek\fP(2), \fBmknod\fP(2), \fBmmap\fP(2), \fBmount\fP(2), \fBopen_by_handle_at\fP(2), \fBopenat2\fP(2), \fBread\fP(2), \fBsocket\fP(2), \fBstat\fP(2), \fBumask\fP(2), \fBunlink\fP(2), \fBwrite\fP(2), \fBfopen\fP(3), \fBacl\fP(5), \fBfifo\fP(7), \fBinode\fP(7), \fBpath_resolution\fP(7), \fBsymlink\fP(7) .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Frédéric Hantrais , Jean-Philippe MENGUAL et Jean-Pierre Giraud . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .