noble (2) creat.2.gz

Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       open, openat, creat - Ouvrir ou créer éventuellement un fichier

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

       int openat(int dirfd, const char *pathname, int flags);
       int openat(int dirfd, const char *pathname, int flags, mode_t mode);

       /* Documenté à part, dans openat2(2) : */
       int openat2(int dirfd, const char *pathname,
                   const struct open_how *how, size_t size);

   Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

       openat() :
           Depuis la glibc 2.10 :
               _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _ATFILE_SOURCE

DESCRIPTION

       L'appel  système open() ouvre le fichier indiqué par pathname. S'il n'existe pas, il peut (si O_CREAT est
       indiqué dans flags) être créé par open().

       La valeur renvoyée par open() 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 (read(2), write(2), lseek(2),  fcntl(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.

       Par défaut, le nouveau descripteur de fichier est configuré pour rester ouvert après un appel à execve(2)
       (son  attribut  FD_CLOEXEC  décrit dans fcntl(2) est initialement désactivé). L'attribut O_CLOEXEC 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 lseek(2)).

       Un  appel  à open() crée une nouvelle description de fichier ouvert, une entrée dans la table de fichiers
       ouverts du système. Cette description de fichier ouvert enregistre la position dans  le  fichier  et  les
       attributs  d’état  du  fichier  (voir  ci-dessous).  Un  descripteur  de  fichier est une référence à une
       description de fichier ouvert ; cette référence n'est pas modifiée si pathname est  ensuite  supprimé  ou
       modifié  pour  faire  référence  à un autre fichier. Pour obtenir plus de détails sur les descriptions de
       fichiers ouverts, consultez NOTES.

       Le paramètre flags est l'un des éléments  O_RDONLY,  O_WRONLY  ou  O_RDWR  qui  réclament  respectivement
       l'ouverture du fichier en lecture seule, écriture seule, ou lecture/écriture.

       De  plus,  zéro ou plusieurs attributs de création de fichier et attributs d'état de fichier peuvent être
       indiqués dans flags avec un OU binaire. Les attributs de création de  fichier  sont  O_CLOEXEC,  O_CREAT,
       O_DIRECTORY,  O_EXCL,  O_NOCTTY,  O_NOFOLLOW,  O_TMPFILE et O_TRUNC. Les attributs d'état de fichier 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 fcntl(2) pour plus de précisions.

       La liste complète des attributs de création et d'état de fichier est la suivante.

       O_APPEND
              Le  fichier  est  ouvert en mode « ajout ». Avant chaque write(2), la tête de lecture/écriture est
              placée à la fin du fichier comme avec lseek(2). La modification de la position dans le fichier  et
              l'opération d'écriture sont effectuées sous forme d'étape atomique unique.

              Il  y a un risque d'endommager le fichier lorsque O_APPEND 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.

       O_ASYNC
              Déclencher un signal (SIGIO par défaut, mais peut être changé via fcntl(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  fcntl(2)  pour  plus  de
              détails. Consultez aussi BOGUES ci-dessous.

       O_CLOEXEC (depuis Linux 2.6.23)
              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  F_SETFD  de  fcntl(2)    pour
              positionner l'attribut FD_CLOEXEC.

              Notez  que  le recours à cet attribut est indispensable pour certains programmes multithreadés. En
              effet, l'utilisation d'une opération F_SETFD de fcntl(2) pour positionner l'attribut FD_CLOEXEC 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 fcntl(2) au moment où un autre  thread
              exécute  fork(2)  suivi  de execve(2). Selon l'ordre dans lequel ces opérations s'exécutent, cette
              concurrence  peut  aboutir  à  ce  que  le  descripteur  de  fichier  renvoyé  par   open()   soit
              involontairement  mis à disposition du programme exécuté par le processus enfant créé par fork(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 O_CLOEXEC pour régler ce problème.)

       O_CREAT
              Si pathname n'existe pas, le créer en tant que fichier normal.

              Le propriétaire (identifiant utilisateur) du nouveau fichier est positionné sur  l'identifiant  de
              l'utilisateur effectif du processus.

              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 bsdgroups et sysvgroups décrites dans mount(8).

              L'argument mode indique les bits du mode du fichier à appliquer lors de la création  d'un  nouveau
              fichier.  Si  ni O_CREAT, ni O_TMPFILE ne sont indiqués dans flags, mode est ignoré (et peut ainsi
              être indiqué en tant que 0 voire absent). L'argument mode doit être fourni si O_CREAT ou O_TMPFILE
              est  indiqué dans flags ; s'il n'est pas indiqué, des octets arbitraires de la pile s'appliqueront
              comme mode du fichier.

              Le mode effectif est modifié par le umask 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 (mode & ~umask).

              Notez que mode ne s'applique qu'aux accès ultérieurs au fichier nouvellement créé ; l'appel open()
              qui crée un fichier dont le mode est en lecture  seule  fournira  quand  même  un  descripteur  de
              fichier en lecture et écriture.

              Les constantes symboliques suivantes sont disponibles pour mode :

              S_IRWXU  00700  L'utilisateur  (propriétaire du fichier) a les autorisations de lecture, écriture,
                       exécution.

              S_IRUSR  00400 L'utilisateur a l'autorisation de lecture.

              S_IWUSR  00200 L'utilisateur a l'autorisation d'écriture.

              S_IXUSR  00100 L'utilisateur a l'autorisation d'exécution.

              S_IRWXG  00070 Le groupe a les autorisations de lecture, écriture, exécution.

              S_IRGRP  00040 Le groupe a l'autorisation de lecture.

              S_IWGRP  00020 Le groupe a l'autorisation d'écriture.

              S_IXGRP  00010 Le groupe a l'autorisation d'exécution.

              S_IRWXO  00007 Tout le monde a les autorisations de lecture, écriture, exécution.

              S_IROTH  00004 Tout le monde a l'autorisation de lecture.

              S_IWOTH  00002 Tout le monde a l'autorisation d'écriture.

              S_IXOTH  00001 Tout le monde a l'autorisation d'exécution.

              Selon POSIX, le positionnement des autres bits dans mode n'a pas d'effet spécifié. Sur Linux,  les
              bits suivants sont également gérés dans mode :

              S_ISUID  0004000 bit set-user-ID.

              S_ISGID  0002000 bit set-group-ID (voir inode(7)).

              S_ISVTX  0001000 bit sticky (voir inode(7)).

       O_DIRECT (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  O_DIRECT  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 O_SYNC que les données  et  métadonnées  sont  transférées.
              Pour  garantir  des  entrées-sorties  synchrones,  l'attribut  O_SYNC doit être utilisé en plus de
              l'attribut O_DIRECT. Consultez la section NOTES ci-dessous.

              Une interface à la sémantique similaire (mais dépréciée) pour les périphériques blocs est  décrite
              dans raw(8).

       O_DIRECTORY
              Si   pathname  n'est  pas  un  répertoire,  l'ouverture  échoue.  Cet  attribut  fut  ajouté  dans
              Linux 2.1.126, pour éviter des problèmes de dysfonctionnement si opendir(3) est  invoqué  sur  une
              FIFO ou un périphérique à bande.

       O_DSYNC
              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 données.

              Au moment où write(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 à write(2) était
              suivi d'un appel à fdatasync(2)). Consultez NOTES ci-dessous.

       O_EXCL S'assurer que cet appel crée le fichier : si cet attribut est spécifié en conjonction avec O_CREAT
              et si le fichier pathname existe déjà, open() échouera avec l'erreur EEXIST.

              Lorsque ces deux attributs sont spécifiés, les liens symboliques ne sont pas suivis : si  pathname
              est un lien symbolique, open() échouera quel que soit l'endroit où pointe le lien symbolique.

              En général, le comportement de O_EXCL est indéterminé s'il est utilisé sans O_CREAT. Il existe une
              exception toutefois : à partir de Linux 2.6, O_EXCL peut être utilisé  sans  O_CREAT  si  pathname
              fait  référence  à  un  périphérique bloc. Si le périphérique bloc est utilisé par le système (par
              exemple, s'il est monté), open() échoue avec l'erreur EBUSY.

              Sur les systèmes de fichiers NFS, O_EXCL  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'O_EXCL 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 O_EXCL 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
              link(2)  pour  créer un lien sur un fichier de verrouillage. Si link(2) renvoie 0, le verrouillage
              est réussi. Sinon, utiliser stat(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.

       O_LARGEFILE
              (LFS)  Permettre  d'ouvrir  des fichiers dont la taille ne peut pas être représentée dans un off_t
              (mais peut l'être dans  un  off64_t).  La  macro  _LARGEFILE64_SOURCE  doit  être  définie  (avant
              d'inclure   tout   fichier   d'en‐tête)   pour   obtenir   cette   définition.  Définir  la  macro
              _FILE_OFFSET_BITS à 64 est la méthode à favoriser pour accéder  à  des  grands  fichiers  sur  des
              systèmes 32 bits, plutôt que d'utiliser O_LARGEFILE (consultez feature_test_macros(7)).

       O_NOATIME (depuis Linux 2.6.8)
              Ne pas mettre à jour la date de dernier accès au fichier ((st_atime dans l'inœud) quand le fichier
              est read(2).

              Cet attribut ne peut être utilisé que si l'une des conditions suivantes est vraie :

              -  L'identifiant utilisateur effectif du fichier correspond à celui du propriétaire du fichier.

              -  Le processus appelant a  la  capacité  CAP_FOWNER  dans  son  espace  de  noms  utilisateur  et
                 l'identifiant utilisateur du propriétaire du fichier a une projection dans l'espace de noms.

              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.

       O_NOCTTY
              Si  pathname correspond à un périphérique de terminal — consultez tty(4) —, il ne deviendra pas le
              terminal contrôlant le processus même si celui-ci n'est attaché à aucun autre terminal.

       O_NOFOLLOW
              Si le composant  final  (c'est-à-dire,  celui  obtenu  par  basename)  de  pathname  est  un  lien
              symbolique,  l'ouverture  échoue  avec  l'erreur  ELOOP. Les liens symboliques dans les composants
              apparus plus tôt dans le chemin seront encore  suivis  (remarquez  que  l'erreur  ELOOP  qui  peut
              intervenir  dans  ce  cas ne peut pas être distinguée de l'échec d'une ouverture à cause d'un trop
              grand nombre de liens symboliques lors de la résolution de composants dans le préfixe du chemin).

              Cet attribut est une extension FreeBSD qui a été ajoutée dans Linux 2.1.126, puis normalisée  dans
              POSIX.1-2008.

              Voir aussi O_PATH ci-dessous.

       O_NONBLOCK ou O_NDELAY
              Si possible, le fichier est ouvert en mode « non-bloquant ». Ni la fonction open() ni aucune autre
              opération d'E/S ultérieure sur le descripteur de fichier renvoyé ne laissera le processus appelant
              en attente.

              Remarquez  que  positionner  cet  attribut  n'a  pas d'effet sur une opération poll(2), select(2),
              epoll(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 O_NONBLOCK clear ne se bloquerait pas.

              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 O_NONBLOCK. Comme  la  sémantique
              de  O_NONBLOCK  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.

              Pour  la  manipulation  des  FIFO  (tubes nommés), voir également fifo(7). Pour une explication de
              l'effet de O_NONBLOCK en conjonction avec les verrouillages impératifs et les  baux  de  fichiers,
              voir fcntl(2).

       O_PATH (depuis Linux 2.6.39)
              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  read(2),  write(2),  fchmod(2),  fchown(2),
              fgetxattr(2), ioctl(2), mmap(2)) échoueront en renvoyant l'erreur EBADF.

              Les opérations suivantes peuvent être réalisées sur le descripteur de fichier obtenu :

              -  close(2).

              -  fchdir(2), si le descripteur de fichier renvoie à un répertoire (depuis Linux 3.5).

              -  fstat(2) (depuis Linux 3.6)

              -  fstatfs(2) (depuis Linux 3.12)

              -  Dupliquer le descripteur de fichier (dup(2), fcntl(2),  F_DUPFD, etc.).

              -  Consulter et affecter les valeurs des attributs du descripteur de fichier (fcntl(2), F_GETFD et
                 F_SETFD).

              -  Récupérer les attributs d'état de fichiers ouverts au moyen de l'opération fcntl(2)   F_GETFL :
                 les attributs renvoyés comprendront le bit O_PATH.

              -  Transmettre le descripteur de fichier comme l'argument  dirfd de openat(2) et les autres appels
                 système « *at() ». Cela comprend linkat(2) avec  AT_EMPTY_PATH  (ou  via  procfs  au  moyen  de
                 AT_SYMLINK_FOLLOW) même si le fichier n'est pas un répertoire.

              -  Transmettre le descripteur de fichier à un autre processus à l’aide d’un socket de domaine UNIX
                 (consultez SCM_RIGHTS dans unix(7)).

              Lorsque O_PATH est précisé dans flags, seuls les bits  O_CLOEXEC,  O_DIRECTORY  et  O_NOFOLLOW  de
              l'attribut sont pris en compte.

              L'ouverture  d'un fichier ou d'un répertoire avec l'attribut O_PATH 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 fchdir(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 O_RDONLY exige que l'appelant ait le droit de lire
              l'objet  même  quand  l'opération ultérieure (par exemple, fchdir(2), fstat(2)) n'a pas besoin des
              droits de lecture sur l'objet.

              Si pathname est un lien symbolique et si l'attribut O_NOFOLLOW est précisé, alors l'appel  renvoie
              le  descripteur de fichier d'un lien symbolique. Ce descripteur de fichier peut être utilisé comme
              l'argument dirfd lors d'appels aux fonctions fchownat(2), fstatat(2), linkat(2)  et  readlinkat(2)
              avec un chemin d'accès vide pour permettre à l'appel de s'exécuter sur le lien symbolique.

              Si  pathname  renvoie  à  un  point  de  montage automatique non encore effectué, donc aucun autre
              système de fichiers n'y est monté, alors l'appel renvoie un descripteur de fichier qui se rapporte
              au répertoire de montage automatique sans effectuer de montage. fstatfs(2) peut alors être utilisé
              pour déterminer s'il s'agit bien d'un point de montage automatique non non  effectué  (.f_type  ==
              AUTOFS_SUPER_MAGIC).

              Une  utilisation  de  O_PATH  sur  des  fichiers  ordinaires consiste à fournir l'équivalent de la
              fonctionnalité O_EXEC 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 :

                  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);

              Un descripteur de fichier O_PATH peut également être fourni comme argument de fexecve(3).

       O_SYNC 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 fichier (contrairement  à  l'exécution  des
              opérations E/S synchrones avec garantie d'intégrité des données fournie par O_DSYNC.)

              Au  moment où write(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 à write(2) était suivi d'un appel à fsync(2)). Consultez NOTES ci-dessous.

       O_TMPFILE (depuis Linux 3.11)
              Créer  un  fichier  temporaire sans nom. L’argument pathname indique un répertoire ; un inœud sans
              nom sera créé dans le système de fichiers de ce répertoire. Tout ce qui est écrit dans le  fichier
              résultant  sera perdu quand le dernier descripteur de fichier sera fermé, à moins de donner un nom
              au fichier.

              O_TMPFILE doit être indiqué avec soit O_RDWR, soit O_WRONLY, et facultativement O_EXCL. Si  O_EXCL
              n’est  pas  indiqué,  alors  linkat(2)  peut  être utilisé pour lier le fichier temporaire dans le
              système de fichiers, le rendant permanent, en utilisant du code comme :

                  char chemin[PATH_MAX];
                  df = open("/chemin/vers/rép.", O_TMPFILE | O_RDWR,
                                          S_IRUSR | S_IWUSR);

                  /* E/S du fichier sur 'fd'... */

                  linkat(fd, "", AT_FDCWD, "/chemin/du/fichier", AT_EMPTY_PATH);

                  /* Si l'appelant n'a pas la capacité CAP_DAC_READ_SEARCH (nécessaire
                     pour utiliser AT_EMPTY_PATH avec linkat(2)) et s'il existe un
                     système de fichiers proc(5) monté, l'appel linkat(2) ci-dessus peut
                     être remplacé par :

                  snprintf(path, PATH_MAX,  "/proc/self/fd/%d", fd);
                  linkat(AT_FDCWD, path, AT_FDCWD, "/chemin/du/fichier",
                                          AT_SYMLINK_FOLLOW);
                  */

              Dans ce cas, l’argument mode d’open() détermine le mode de droits du fichier, comme avec O_CREAT.

              Indiquer O_EXCL en conjonction avec O_TMPFILE empêche  de  lier  un  fichier  temporaire  dans  le
              système  de  fichiers comme précédemment (remarquez que la signification de O_EXCL dans ce cas est
              différente de la signification habituelle de O_EXCL).

              Les deux principaux cas d’utilisation de O_TMPFILE sont présentés ci-dessous :

              -  Améliorer la fonctionnalité tmpfile(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.

              -  Créer  un  fichier  initialement  invisible,  qui  est  ensuite peuplé de données et ajusté aux
                 attributs de système de fichiers  adéquats  (fchown(2),  fchmod(2),  fsetxattr(2), etc.)  avant
                 d’être  lié  de  façon atomique dans le système de fichiers dans un état complètement formé (en
                 utilisant linkat(2) comme décrit précédemment).

              O_TMPFILE 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)

       O_TRUNC
              Si le fichier existe, est un fichier ordinaire et que le mode d’accès permet l’écriture (O_RDWR ou
              O_WRONLY),  il  sera  tronqué  à une longueur nulle. Si le fichier est une FIFO ou un périphérique
              terminal, l'attribut O_TRUNC est ignoré. Sinon, le comportement de O_TRUNC n'est pas précisé.

   creat()
       L'appel creat() est équivalent à open() avec l'attribut flags égal à O_CREAT|O_WRONLY|O_TRUNC.

   openat()
       L'appel système openat() fonctionne de la même façon que open(), les différences étant décrites ici.

       L'argument dirfd est utilisé avec l'argument pathname comme suit :

       -  Si le chemin fourni dans pathname est absolu, alors dirfd est ignoré.

       -  Si le chemin fourni dans pathname est un chemin relatif et si dirfd a  la  valeur  spéciale  AT_FDCWD,
          alors  pathname  est  interprété  par  rapport au répertoire courant du processus appelant, comme dans
          open().

       -  Si pathname est un chemin relatif, il est interprété  par  rapport  au  répertoire  référencé  par  le
          descripteur  de  fichier  dirfd  (plutôt  que par rapport au répertoire courant du processus appelant,
          comme cela est fait par open() pour un chemin relatif). Dans ce cas, dirfd doit être un répertoire qui
          a été ouvert en lecture (O_RDONLY) ou en utilisant l'attribut O_PATH.

       Si  le  chemin fourni dans pathname est un chemin relatif et si dirfd n'est pas un descripteur de fichier
       valable, il en résulte une erreur (EBADF). (Spécifier un numéro de descripteur  de  fichier  non  valable
       dans dirfd peut être utilisé comme moyen de s'assurer que pathname est absolu.)

   openat2(2)
       L'appel  système  openat2(2)  est  une extension de openat() et il fournit un ensemble supplémentaire aux
       fonctionnalités de openat(). Il est documenté à part dans openat2(2).

VALEUR RENVOYÉE

       open(), openat() et creat() renvoient le nouveau descripteur de fichier (un  entier  non  négatif)  s'ils
       réussissent. En cas d'erreur, ou -1 est renvoyé et errno est défini pour indiquer l'erreur.

ERREURS

       open(), openat() et creat() peuvent échouer avec les erreurs suivantes :

       EACCES L'accès demandé au fichier est interdit, ou la permission de parcours pour l'un des répertoires du
              chemin pathname est refusée, ou le fichier n'existe pas encore et le répertoire parent  ne  permet
              pas l'écriture. (Consultez aussi path_resolution(7).)

       EACCES Lorsque O_CREAT est indiqué, le systcl protected_fifos ou protected_regular 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
              /proc/sys/fs/protected_fifos et de /proc/sys/fs/protected_regular dans proc(5).

       EBADF  (openat()) pathname est relatif mais dirfd n'est ni AT_FDCWD ni un descripteur de fichier valable.

       EBUSY  O_EXCL  était  indiqué  dans  flags  et pathname se rapporte à un périphérique bloc utilisé par le
              système (par exemple, il est monté).

       EDQUOT Si O_CREAT 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.

       EEXIST pathname existe déjà et O_CREAT et O_EXCL ont été indiqués.

       EFAULT nom_chemin pointe en dehors de l'espace d'adressage accessible.

       EFBIG  Consultez EOVERFLOW.

       EINTR  Pendant  qu'il  était  bloqué  en  attente de l'ouverture d'un périphérique lent (par exemple, une
              FIFO ; consultez fifo(7)), l'appel a été interrompu par  un  gestionnaire  de  signal ;  consultez
              signal(7).

       EINVAL Le  système  de  fichiers  ne  gère  pas  l’attribut O_DIRECT. Consultez NOTES pour de plus amples
              renseignements.

       EINVAL Valeur incorrecte dans flags.

       EINVAL O_TMPFILE a été indiqué dans flags, mais ni O_WRONLY ni O_RDWR n’ont été indiqués.

       EINVAL O_CREAT était indiqué dans flags et le composant  final  (« basename »)  du  pathname  du  nouveau
              fichier  n'est pas valable (il contient par exemple des caractères non autorisés par le système de
              fichiers sous-jacent).

       EINVAL Le composant final (« basename ») de pathname n'est pas valable (il  contient,  par  exemple,  des
              caractères non autorisés par le système de fichiers sous-jacent).

       EISDIR Une  écriture  a  été demandée alors que pathname correspond à un répertoire (en fait, O_WRONLY ou
              O_RDWR ont été déclarés).

       EISDIR pathname fait référence à un répertoire existant, O_TMPFILE et soit O_WRONLY, soit O_RDWR, ont été
              indiqués dans flags, mais cette version du noyau ne fournit pas la fonctionnalité O_TMPFILE.

       ELOOP  Trop de liens symboliques ont été rencontrés en parcourant nom_chemin.

       ELOOP  pathname était un lien symbolique, et flags indiquait O_NOFOLLOW mais pas O_PATH.

       EMFILE La  limite  par  processus  du  nombre de descripteurs de fichiers ouverts a été atteinte (voir la
              description de RLIMIT_NOFILE dans getrlimit(2)).

       ENAMETOOLONG
              nom_chemin est trop long.

       ENFILE La limite du nombre total de fichiers ouverts pour le système entier a été atteinte.

       ENODEV pathname correspond à un fichier spécial et il n'y a pas de périphérique correspondant. (Ceci  est
              un bogue du noyau Linux ; dans cette situation, ENXIO devrait être renvoyé.)

       ENOENT O_CREAT n'est pas positionné et le fichier nommé n'existe pas.

       ENOENT Un  des  répertoires  du chemin d'accès nom_chemin n'existe pas ou est un lien symbolique pointant
              nulle part.

       ENOENT pathname fait référence à un répertoire inexistant, O_TMPFILE et soit O_WRONLY, soit  O_RDWR,  ont
              été indiqués dans flags, mais cette version du noyau ne fournit pas la fonctionnalité O_TMPFILE.

       ENOMEM 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 pipe(7).

       ENOMEM La mémoire disponible du noyau n'était pas suffisante.

       ENOSPC pathname  devrait  être créé mais le périphérique concerné n'a plus assez de place pour un nouveau
              fichier.

       ENOTDIR
              Un élément du chemin d'accès utilisé comme répertoire dans pathname ne l’est  pas,  ou  l'attribut
              O_DIRECTORY est utilisé et pathname n'est pas un répertoire.

       ENOTDIR
              (openat())  pathname  est  un  chemin  relatif et le descripteur de fichier dirfd est associé à un
              fichier, pas à un répertoire.

       ENXIO  O_NONBLOCK | O_WRONLY est positionné, le fichier nommé est une FIFO et le processus n'a pas  cette
              FIFO ouverte en lecture.

       ENXIO  Le fichier est un fichier spécial de périphérique et il n'existe aucun périphérique correspondant.

       ENXIO  Le fichier est un socket de domaine UNIX.

       EOPNOTSUPP
              Le système de fichiers contenant pathname ne prend pas en charge O_TMPFILE.

       EOVERFLOW
              pathname  fait  référence  à un fichier ordinaire qui est trop grand pour être ouvert. Cela arrive
              quand une application compilée sur une  plate-forme  32 bits  sans  -D_FILE_OFFSET_BITS=64  essaie
              d'ouvrir  un  fichier  dont  la  taille  dépasse (2^31)-1 octets ; consultez également O_LARGEFILE
              ci-dessus. C'est l'erreur spécifiée par POSIX.1 ; avant Linux 2.6.24, Linux  fournissait  l'erreur
              EFBIG dans ce cas.

       EPERM  L'attribut  O_NOATIME  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é.

       EPERM  La lecture a été interrompue par un signal ; consultez fnctl(2).

       EROFS  Un accès en écriture est demandé alors que pathname réside sur un système de fichiers  en  lecture
              seule.

       ETXTBSY
              Une  écriture  a  été  demandée alors que pathname correspond à un fichier exécutable actuellement
              utilisé.

       ETXTBSY
              pathname se rapporte à un fichier actuellement  utilisé  comme  fichier  d'échange  et  l'attribut
              O_TRUNC a été indiqué.

       ETXTBSY
              pathname se rapporte à un fichier actuellement lu par le noyau (par exemple pour charger un module
              ou du micro-code), et un accès en écriture a été demandé.

       EWOULDBLOCK
              L'attribut O_NONBLOCK est indiqué, et un bail incompatible est détenu sur  le  fichier  (consultez
              fcntl(2)).

VERSIONS

       openat()  a  été  ajouté  dans Linux 2.6.16 ; la prise en charge de la bibliothèque a été ajoutée dans la
       glibc 2.4.

STANDARDS

       open(), creat() : SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

       openat() : POSIX.1-2008.

       openat2(2) est spécifique à Linux.

       Les attributs O_DIRECT, O_NOATIME, O_PATH et O_TMPFILE sont spécifiques à Linux.  _GNU_SOURCE  doit  être
       définie pour obtenir leurs définitions.

       Les  attributs O_CLOEXEC, O_DIRECTORY et O_NOFOLLOW ne sont pas spécifiés dans POSIX.1-2001, mais le sont
       dans POSIX.1-2008. Depuis glibc 2.12,  leurs  définitions  peuvent  être  obtenues  en  définissant  soit
       _POSIX_C_SOURCE  avec  une  valeur  supérieure  ou  égale  à  200809L, soit _XOPEN_SOURCE avec une valeur
       supérieure ou égale à 700. Dans glibc 2.11 et les versions  précédentes,  les  définitions  peuvent  être
       obtenues en définissant _GNU_SOURCE.

       Comme  indiqué  dans feature_test_macros(7), les macros de test de fonctionnalités comme _POSIX_C_SOURCE,
       _XOPEN_SOURCE et _GNU_SOURCE doivent être définies avant d'inclure n’importe quel fichier d'en-tête.

NOTES

       Sous Linux, l'attribut  O_NONBLOCK  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 ioctl(2).

       L'effet (indéfini) de O_RDONLY | O_TRUNC varie selon  l'implémentation.  Sur  de  nombreux  systèmes,  le
       fichier est effectivement tronqué.

       Notez  que  open()  peut ouvrir des fichiers spéciaux mais creat() ne peut pas en créer, il faut utiliser
       mknod(2) à la place.

       Si un fichier est créé, ses horodatages st_atime, st_ctime, st_mtime  (respectivement  heure  de  dernier
       accès,  de  dernière modification d'état, et de dernière modification ; consultez stat(2)) sont définis à
       l'heure actuelle, ainsi que les champs st_ctime et st_mtime du répertoire parent. Sinon,  si  le  fichier
       est  modifié  à  cause  de  l'attribut O_TRUNC, ses champs st_ctime et st_mtime sont remplis avec l'heure
       actuelle.

       Les fichiers du répertoire /proc/[pid]/fd affichent les descripteurs  de  fichier  ouverts  du  processus
       ayant   l'identifiant   pid.  Les  fichiers  du  répertoire  /proc/[pid]/fdinfo  présentent  encore  plus
       d'informations sur ces descripteurs  de  fichier.  Voir  proc(5)  pour  plus  de  détails  sur  ces  deux
       répertoires.

       Le fichier d'en-tête <asm/fcntl.h> du noyau Linux ne définit pas O_ASYNC ; son synonyme FASYNC (dérivé de
       BSD) l'est en revanche.

   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, struct file.

       Lorsqu'un  descripteur  de  fichiers  est dupliqué (au moyen de dup(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
       fork(2)  hérite  des  copies  des descripteurs de fichier de ses parents, et ces copies pointent vers les
       mêmes descriptions de fichier ouvert.

       Chaque opération open(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.

       Sur  Linux,  on  peut  utiliser KCMP_FILE de kcmp(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.

   E/S synchrones
       L'option POSIX-1.2008 « E/S synchrones » décrit des variantes des E/S  synchrones,  ainsi  que  plusieurs
       attributs de open() permettant d'en contrôler le comportement : O_SYNC, O_DSYNC et O_RSYNC. Sans chercher
       à savoir si une implémentation accepte cette option, elle doit au moins prendre en  charge  l'utilisation
       de O_SYNC pour les fichiers normaux.

       Linux met en œuvre O_SYNC et O_DSYNC, mais pas O_RSYNC. De façon plus ou moins correcte, la glibc définit
       O_RSYNC de façon à avoir la même valeur que O_SYNC. (O_RSYNC est défini  dans  le  fichier  d'en-tête  du
       noyau Linux <asm/fcntl.h> de HP PA-RISC, mais il n'est pas utilisé).

       O_SYNC  fournit  l'exécution d'E/S synchrones avec garantie d'intégrité des fichiers, ce qui signifie que
       les opérations d'écriture envoient les données et les métadonnées associées au matériel. O_DSYNC  fournit
       l'exécution  d'E/S  synchrones  avec garantie d'intégrité des données, 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.

       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 (st_mtime) 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, O_DSYNC transmettrait
       seulement la métadonnée relative à la longueur du fichier (quand  O_SYNC  y  ajouterait  l'horodatage  de
       dernière modification).

       Avant  Linux 2.6.33, Linux mettait seulement en œuvre l'attribut O_SYNC de open(). 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 données (autrement dit, O_SYNC était de
       fait mis en œuvre comme O_DSYNC).

       A partir de Linux 2.6.33, une véritable prise de charge de O_SYNC est fournie. Cependant, pour assurer la
       compatibilité  ascendante binaire, O_DSYNC a été défini avec la même valeur que le O_SYNC « historique »,
       et O_SYNC a été défini comme un nouvel attribut (de deux bits)  qui  comprend  l'attribut  O_DSYNC.  Ceci
       permet  d'assurer que les applications compilées avec les nouveaux en-têtes auront au moins la sémantique
       de O_DSYNC avant Linux 2.6.33.

   Différences entre bibliothèque C et noyau
       Depuis la glibc 2.26, la fonction enveloppe de la glibc de open() utilise  l'appel  système  openat()  au
       lieu  de  l'appel  système  open()  du  noyau. Pour certaines architectures, cela est aussi vrai avant la
       glibc 2.26.

   NFS
       Plusieurs problèmes se posent avec le protocole NFS, concernant entre autres O_SYNC, et O_NDELAY.

       Sur les systèmes de fichiers NFS, où la  correspondance  d'UID  est  activée,  open()  peut  renvoyer  un
       descripteur  de  fichier  alors  qu'une  requête  read(2)  par exemple sera refusée avec le code d'erreur
       EACCES. En effet,  le  client  a  effectué  open()  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.

   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 fifo(7) pour plus de détails.

   Mode d’accès au fichier
       Contrairement aux autres valeurs qui peuvent être indiquées dans  flags,  les  valeurs  du  mode  d'accès
       O_RDONLY,  O_WRONLY  et O_RDWR ne sont pas des bits individuels. Ils définissent l'ordre des deux bits de
       poids faible de flags, et ont pour valeur respective  0,  1  et  2.  En  d'autres  termes,  l'association
       O_RDONLY | O_WRONLY est une erreur logique et n'a certainement pas la même signification que O_RDWR.

       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  ioctl(2)  propres  aux
       périphériques.

   Justification des appels openat() et des API des descripteurs de fichier de répertoires
       openat()  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,  execveat(2),  faccessat(2),
       fanotify_mark(2),  fchmodat(2),  fchownat(2), fspick(2), fstatat(2), futimesat(2), linkat(2), mkdirat(2),
       mknodat(2),   mount_setattr(2),   move_mount(2),    name_to_handle_at(2),    open_tree(2),    openat2(2),
       readlinkat(2),  renameat(2), renameat2(2), statx(2), symlinkat(2), unlinkat(2), utimensat(2), mkfifoat(3)
       et scandirat(3)) gèrent deux problèmes avec les anciennes interfaces. L'explication est ici  donnée  dans
       le contexte de l'appel openat(), mais elle est semblable pour les autres interfaces.

       Tout  d'abord,  openat()  permet  à  une  application  d'éviter les problèmes d'accès concurrents lors de
       l'utilisation de open() 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é à open() peut être modifié
       parallèlement à l'appel open(). Supposons par exemple qu'on veuille créer  le  fichier  dir1/dir2/xxx.dep
       alors  que  le fichier dir1/dir2/xxx existe. Le problème est qu'entre la vérification de son existence et
       l'étape de création du fichier, dir1 ou dir2 (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  dirfd
       de  (disons)  fstatat(2)  et openat(). L'utilisation du descripteur de fichier dirfd a également d'autres
       avantages :

       -  le descripteur de fichier est une référence stable au répertoire, même si le répertoire est renommé ;

       -  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.

       Enfin,  openat()  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
       /proc/self/fd/dirfd, mais de façon moins efficace.

       L'argument  dirfd  de  ces API peut être obtenu par l'utilisation de open() ou de openat() pour ouvrir un
       répertoire (avec le drapeau O_RDONLY ou O_PATH). Sinon, un tel descripteur de fichier peut être obtenu en
       appliquant un dirfd(3) au flux d'un répertoire créé avec opendir(3).

       Quand  on donne aux API un argument dirfd de AT_FDCWD 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 flags qui offre un accès à cette fonctionnalité non disponible avec
       les interfaces conventionnelles correspondantes.

   O_DIRECT
       L'attribut O_DIRECT 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 O_DIRECT mal alignées varie aussi ;
       elles peuvent soit échouer avec l'erreur EINVAL soit se replier sur des entrées-sorties mises en tampon.

       Depuis Linux 6.1, la prise en charge de O_DIRECT et les restrictions d'alignement pour un fichier peuvent
       être   recherchées  avec  statx(2)  en  utilisant  l'attribut  STATX_DIOALIGN.  La  prise  en  charge  de
       STATX_DIOALIGN varie selon le système de fichiers ; consultez statx(2).

       Certains systèmes de  fichiers  fournissent  leur  propre  interface  pour  rechercher  les  restrictions
       d'alignement  de  O_DIRECT,  par exemple l'opération XFS_IOC_DIOINFO de xfsctl(3). STATX_DIOALIGN devrait
       être utilisé à la place quand il est disponible.

       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
       BLKSSZGET de ioctl(2) ou avec la commande shell suivante :

           blockdev --getss

       Les E/S O_DIRECT ne devraient jamais être exécutées en même temps que  l'appel  système  fork(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 MAP_PRIVATE de mmap(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  fork(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
       O_DIRECT  a  été  créé  en utilisant shmat(2) ou mmap(2) avec l'attribut MAP_SHARED. Cette restriction ne
       s'applique pas non plus quand le tampon mémoire a été configuré comme MADV_DONTFORK avec  madvise(2),  en
       s'assurant qu'il ne sera pas disponible au fils après fork(2).

       L'attribut  O_DIRECT a été introduit par SGI IRIX, qui a des restrictions d'alignement identiques à Linux
       2.4. IRIX a aussi un appel fcntl(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.

       La gestion de O_DIRECT 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  open()  échouera  avec
       l'erreur EINVAL s'il est utilisé.

       Les  applications  devraient  éviter  de  mélanger  des entrées-sorties O_DIRECT 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 mmap(2) et d'entrées-sorties directes pour les mêmes fichiers.

       Le  comportement de O_DIRECT 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 O_DIRECT 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 O_DIRECT.
       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 O_DIRECT.

       En résumé, O_DIRECT est un outil potentiellement puissant qui doit  être  utilisé  avec  précaution.  Les
       applications  devraient  utiliser  O_DIRECT  comme  une option pour améliorer les performances et qui est
       désactivée par défaut.

BOGUES

       Actuellement, il n'est pas possible d'activer les entrées-sorties contrôlées par les signaux en indiquant
       O_ASYNC lors de l'appel open() ; il faut utiliser fcntl(2) pour activer cet attribut.

       Deux  codes  d’erreur différents – EISDIR et ENOENT — doivent être vérifiés pour essayer de déterminer si
       le noyau prend en charge la fonctionnalité O_TMPFILE.

       Quand O_CREAT et O_DIRECTORY sont indiqués dans flags et que le fichier  indiqué  par  pathname  n'existe
       pas, open() créera un fichier ordinaire (c'est-à-dire que O_DIRECTORY est ignoré).

VOIR AUSSI

       chmod(2),   chown(2),  close(2),  dup(2),  fcntl(2),  link(2),  lseek(2),  mknod(2),  mmap(2),  mount(2),
       open_by_handle_at(2), openat2(2), read(2), socket(2), stat(2), umask(2), unlink(2),  write(2),  fopen(3),
       acl(5), fifo(7), inode(7), path_resolution(7), symlink(7)

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>,     Frédéric     Hantrais     <fhantrais@gmail.com>,      Jean-Philippe      MENGUAL
       <jpmengual@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

       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⟩.