dwww Home | Manual pages | Find package

open(2)                       System Calls Manual                      open(2)

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 version 2.10 de la glibc :
               _POSIX_C_SOURCE >= 200809L
           Avant la version 2.10 de la glibc :
               _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 pro-
       cessus 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  des-
       cripteur  de fichier renvoyé par un appel réussi sera celui du plus pe-
       tit 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 attri-
       buts 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  attri-
       buts  d'état de fichier peuvent être indiqués dans flags avec un OU bi-
       naire. 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  ato-
              mique 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 pos-
              sibles sur ce descripteur. Ceci n'est possible que pour les ter-
              minaux,  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 po-
              sitionner l'attribut FD_CLOEXEC.

              Notez que le recours à cet attribut est indispensable pour  cer-
              tains  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 concur-
              rents 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 ren-
              voyé  par open() soit involontairement mis à disposition du pro-
              gramme 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  pro-
              cessus.

              Le  groupe  (identifiant  de groupe) propriétaire du nouveau fi-
              chier 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  op-
              tions 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 ma-
              niè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 au-
                       torisations 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,  écri-
                       ture, 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  applica-
              tions 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 trans-
              fert  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. Consul-
              tez 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 at-
              tribut  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 don-
              née, elle a été transmise au matériel sur lequel s'exécute l'ap-
              pel,  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 à fdata-
              sync(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 : à par-
              tir de Linux 2.6, O_EXCL peut être utilisé sans O_CREAT si path-
              name  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  pro-
              grammes 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 aug-
              menté  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 à favori-
              ser pour accéder à des grands fichiers sur des systèmes 32 bits,
              plutôt que d'utiliser  O_LARGEFILE  (consultez  feature_test_ma-
              cros(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  es-
                 pace de noms utilisateur et l'identifiant utilisateur du pro-
                 priétaire du fichier a une projection dans l'espace de noms.

              Cet attribut est seulement conçu pour les  programmes  d'indexa-
              tion  et d'archivage, pour lesquels il peut réduire significati-
              vement l'activité du disque. L'attribut peut ne pas être  effec-
              tif  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 proces-
              sus 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  appa-
              rus  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  effec-
              tué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  or-
              dinaires  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  éven-
              tuellement être implémentée, les applications ne doivent pas dé-
              pendre d'un blocage comportemental quand elles indiquent cet at-
              tribut  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 fi-
              chiers, 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 exclusive-
              ment 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 descrip-
              teur de fichier obtenu :

              •  close(2).

              •  fchdir(2), si le descripteur de fichier renvoie à  un  réper-
                 toire (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  descrip-
                 teur 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éper-
                 toire.

              •  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érifica-
              tion 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  lec-
              ture 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 uti-
              lisé comme l'argument dirfd lors d'appels aux  fonctions  fchow-
              nat(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  se-
              lon 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  don-
              né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  (autre-
              ment  dit, comme si chaque appel à write(2) était suivi d'un ap-
              pel à fsync(2)). Consultez NOTES ci-dessous.

       O_TMPFILE (depuis Linux 3.11)
              Créer un fichier temporaire sans nom.  L’argument  pathname  in-
              dique  un  répertoire ; un inœud sans nom sera créé dans le sys-
              tème de fichiers de ce répertoire. Tout ce qui est écrit dans le
              fichier résultant sera perdu quand le dernier descripteur de fi-
              chier 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 lin-
              kat(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édem-
              ment  (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ésen-
              tés ci-dessous :

              •  Améliorer la fonctionnalité tmpfile(3) : création de fichiers
                 temporaires sans situation de compétition qui (1) sont  auto-
                 matiquement  supprimés à la fermeture ; (2) ne peuvent jamais
                 être atteints par n’importe quel chemin ; (3) ne sont pas ex-
                 posé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 peu-
                 plé 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 fi-
              chiers sous-jacent. Seule une partie des  systèmes  de  fichiers
              Linux  fournit cette prise en charge. Dans l'implémentation ini-
              tiale, la prise en charge était assurée pour les systèmes de fi-
              chiers 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 compor-
              tement 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 uti-
          lisant 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  do-
       cumenté à 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 sui-
       vantes :

       EACCES L'accès demandé au fichier est interdit,  ou  la  permission  de
              parcours  pour l'un des répertoires du chemin pathname est refu-
              sé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 pro-
              tected_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_re-
              gular 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éri-
              phérique lent (par exemple, une FIFO ; consultez fifo(7)), l'ap-
              pel  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.  Consul-
              tez 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  (« base-
              name »)  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_TMP-
              FILE.

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

       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 path-
              name  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 compi-
              lée sur une plate-forme 32 bits sans -D_FILE_OFFSET_BITS=64  es-
              saie  d'ouvrir  un  fichier  dont la taille dépasse (2^31)-1 oc-
              tets ; 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'appe-
              lant  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 fi-
              chier 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 ac-
              cè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  bi-
       bliothè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éci-
       fié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  fonc-
       tionnalité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éper-
       toire 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 ac-
       tuelle.

       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 ou-
       verts  du système. Dans d'autres contextes, cet objet est également ap-
       pelé « objet de fichier ouvert », « gestionnaire de fichier », « entrée
       de  la table des fichiers ouverts » ou encore, dans le jargon des déve-
       loppeurs 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 fi-
       chier ouvert que le descripteur de fichier d'origine. Les deux descrip-
       teurs 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'in-
       té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,  imagi-
       nez deux extraits de métadonnées d'un fichier : l'horodatage de la der-
       nière modification (st_mtime) et la longueur  du  fichier.  Toutes  les
       opérations d'écriture modifieront l'horodatage de la dernière modifica-
       tion, mais seules les écritures en fin de fichier modifieront  la  lon-
       gueur.  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 lon-
       gueur 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 com-
       prend  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() uti-
       lise 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 acti-
       vée, open() peut renvoyer un descripteur de fichier  alors  qu'une  re-
       quê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'ac-
       cè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 uti-
       lisé 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 fonc-
       tions de bibliothèques qui reçoivent pour argument  un  descripteur  de
       fichier  de  répertoire (c'est-à-dire, execveat(2), faccessat(2), fano-
       tify_mark(2), fchmodat(2), fchownat(2), fspick(2), fstatat(2),  futime-
       sat(2),    linkat(2),    mkdirat(2),    mknodat(2),   mount_setattr(2),
       move_mount(2), name_to_handle_at(2), open_tree(2), openat2(2), readlin-
       kat(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  inter-
       faces.

       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 fi-
       chiers  dans des répertoires autres que le répertoire courant. Ces pro-
       blè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'applica-
       tion.  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 ob-
       tenu  en appliquant un dirfd(3) au flux d'un répertoire créé avec open-
       dir(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 ma-
       niè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 cor-
       respondantes.

   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éca-
       lages de fichier pour les entrées-sorties. Sous Linux, les restrictions
       d'alignement varient en fonction du système de fichiers et de  la  ver-
       sion  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_DIOA-
       LIGN 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 sys-
       tè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'at-
       tribut  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 pro-
       cessus  père et fils. Cette restriction ne s'applique pas quand le tam-
       pon 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  restric-
       tions  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  Li-
       nux 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_DI-
       RECT 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 tou-
       jours 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éri-
       fiés  pour  essayer  de déterminer si le noyau prend en charge la fonc-
       tionnalité 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),  mk-
       nod(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 Chris-
       tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <ste-
       phan.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.cou-
       lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>,  Thomas  Huriaux
       <thomas.huriaux@gmail.com>,  Nicolas François <nicolas.francois@centra-
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon  Paillard  <si-
       mon.paillard@resel.enst-bretagne.fr>,    Denis   Barbier   <barbier@de-
       bian.org>, David Prévot <david@tilapin.org>, Frédéric  Hantrais  <fhan-
       trais@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⟩.

Pages du manuel de Linux 6.03   5 février 2023                         open(2)

Generated by dwww version 1.15 on Sat Jun 29 01:48:50 CEST 2024.