focal (2) creat.2.gz

Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

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

SYNOPSIS

       #include <sys/types.h>
       #include <sys/stat.h>
       #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);

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

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

DESCRIPTION

       Étant  donné  le  chemin  pathname  d'un  fichier, open() renvoie un descripteur de fichier (petit entier
       positif ou nul) qui pourra  ensuite  être  utilisé  dans  d'autres  appels  système  (read(2),  write(2),
       lseek(2),  fcntl(2),  etc.).  Le  descripteur  de  fichier renvoyé par un appel réussi sera le plus petit
       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 entrée enregistre la position dans  le  fichier  et  les  attributs  d'état  du
       fichier  (modifiables par l'opération F_SETFL de fcntl(2)). Un descripteur de fichier est une référence à
       l'une de ces entrées ; cette référence n'est pas modifiée si pathname est  ensuite  supprimé  ou  modifié
       pour  correspondre  à  un  autre  fichier.  La  nouvelle description de fichier ouvert n'est initialement
       partagée avec aucun autre processus, mais ce partage peut apparaître après un fork(2).

       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,  O_TRUNC et O_TTY_INIT. 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 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 ». Initialement,  et  avant  chaque  write(2),  la  tête  de
              lecture/écriture est placée à la fin du fichier comme avec lseek(2). 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
              supporte pas l'opération d'ajout de données dans un fichier, aussi le noyau du client  est  obligé
              de la simuler, avec un risque de 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  fcntl(2)  F_SETFD 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 fcntl(2) F_SETFD 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
              execute 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 fils  créé  par  fork(2).
              (Ce  type  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
              Créer  le  fichier  s'il  n'existe  pas.  Le  possesseur (UID) du fichier est renseigné avec l'UID
              effectif du processus. Le groupe propriétaire (GID) du fichier est le GID effectif du processus ou
              le  GID  du répertoire parent (cela dépend du système de fichiers, des options de montage, du mode
              du répertoire parent ; consultez les options de montage bsdgroups et sysvgroups décrites  dans  la
              page mount(8)).

              Le  paramètre mode indique les droits à utiliser si un nouveau fichier est créé. Ce paramètre doit
              être fourni quand O_CREAT ou O_TMPFILE sont indiqués dans flags ; si ni O_CREAT  ni  O_TMPFILE  ne
              sont précisés, mode est ignoré. Les droits effectifs sont modifiées par le umask du processus : la
              véritable valeur utilisée est (mode & ~umask). Remarquez que ce 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.

       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
              à la page raw(8).

       O_DIRECTORY
              Si  pathname  n'est pas un répertoire, l'ouverture échoue. Cet attribut fut ajouté dans la version
              2.1.126 du noyau, pour éviter des problèmes de dysfonctionnement si opendir(3) est invoqué sur une
              FIFO ou un périphérique de 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.

              Lorsque ces deux attributs sont spécifiés, les liens symboliques ne sont pas suivis : si  pathname
              est un lien symbolique, open() échouera quelque 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 fichier atomique 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.pour vérifier si le nombre de
              liens a augmenté jusqu'à 2. Ne pas utiliser la valeur de retour de link(2).

       O_LARGEFILE
              (LFS) Permet 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 l'heure de dernier accès au fichier (champ  st_atime  de  l'inœud)  quand  le
              fichier  est  lu avec read(2). Ce 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  pathname  est  un  lien  symbolique,  l'ouverture échoue. C’est une extension FreeBSD, qui fut
              ajoutée à Linux dans la version 2.1.126. Les liens symboliques se trouvant dans le chemin  d'accès
              proprement dit seront suivis normalement. Consultez également O_PATH dans la suite du document.

       O_NONBLOCK ou O_NDELAY
              Le  fichier  est  ouvert en mode « non-bloquant ». Ni la fonction open() ni aucune autre opération
              ultérieure sur ce fichier ne laissera le processus appelant en attente. 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), 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)  (à partir de Linux 3.5); fstat(2)  (à partir de Linux 3.6).

              *  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
                 and 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() ».

              *  Transmettre  le  descripteur  de  fichier  à  un autre processus via une socket de domaine UNIX
                 (consultez SCM_RIGHTS dans unix(7)).

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

              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.

       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
              s’est pas indiqué, alors linkat(2) peut être utilisé pour  lier  le  fichier  temporaire  dans  le
              système de fichier, 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);

                  /* Entrée et sortie du fichier sur « df »… */

                  snprintf(chemin, PATH_MAX,  "/proc/self/fd/%d", df);
                  linkat(AT_FDCWD, chemin, AT_FDCWD, "/chemin/vers/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 leur 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 (chown(2), chmod(2), fsetxattr(2), etc.) avant d’être
                 automatiquement lié 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. Seul 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 shmem.
              XFS est également pris en charge depuis Linux 3.15.

       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é.  Sur
              de  nombreuses  versions  de  Linux,  il  sera  ignoré ;  sur d'autres versions il déclenchera une
              erreur).

   creat()
       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.

       Si le chemin donné dans pathname est relatif, il est interprété  par  rapport  au  répertoire  auquel  le
       descripteur de fichier dirfd fait référence (et non par rapport au répertoire courant du processus, comme
       pour open()).

       Si 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 absolu, dirfd est ignoré.

VALEUR RENVOYÉE

       open(),  openat()  et  creat() renvoient le nouveau descripteur de fichier s'ils réussissent, ou -1 s'ils
       échouent, auquel cas errno contient le code d'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).)

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

       EISDIR Une écriture a été demandée alors que pathname correspond à un répertoire (en  fait,  O_WRONLY  ou
              O_RDWR ont été demandé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 pathname.

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

       EMFILE Le processus a déjà ouvert le nombre maximal de fichiers.

       ENAMETOOLONG
              pathname est trop long.

       ENFILE La limite du nombre total de fichiers ouverts sur le système 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  est  absent  et  le  fichier  n'existe  pas.  Ou un répertoire du chemin d'accès pathname
              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 Pas assez de mémoire pour le noyau.

       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 pathname n'est pas  un  répertoire,  ou  l'attribut  O_DIRECTORY  est
              utilisé et pathname n'est pas un répertoire.

       ENXIO  O_NONBLOCK  |  O_WRONLY  est  indiqué,  le fichier est une FIFO et le processus n'a pas de fichier
              ouvert en lecture.  Ou  le  fichier  est  un  nœud  spécial  et  il  n'y  a  pas  de  périphérique
              correspondant.

       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 bits ; consultez également O_LARGEFILE
              ci-dessus. C'est l'erreur spécifiée par POSIX.1-2001 ; dans les noyaux  antérieurs  à  la  version
              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 le propriétaire du
              fichier, et l'appelant n'est pas privilégié (CAP_FOWNER).

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

       ETXTBSY
              On  a  demandé  une  écriture  alors  que pathname correspond à un fichier exécutable actuellement
              utilisé.

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

       Les erreurs supplémentaires suivantes peuvent également se produire pour openat() :

       EBADF  dirfd n'est pas un descripteur de fichier valable.

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

VERSIONS

       openat() a été ajouté au noyau Linux dans sa version 2.6.16 ; la glibc le gère depuis la version 2.4.

CONFORMITÉ

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

       openat() : POSIX.1-2008.

       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 indique que l'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.

   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 oeuvre O_SYNC et O_DSYNC, mais pas O_RSYNC. (De façon plus ou moins correcte, glibc définit
       O_RSYNC de façon à avoir la même valeur que O_SYNC.)

       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 metadonné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  metadonné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 oeuvre 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 oeuvre 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 sur les noyaux antérieurs à 2.6.33.

   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.

   mode 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 d'accès spécial et non-standard 3 (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ée  qu'à  des  opérations  ioctl(2)  propres  aux
       périphériques.

   Justification des appels openat() et des APIs 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,  faccessat(2),  fanotify_mark(2),
       fchmodat(2),     fchownat(2),    fstatat(2),    futimesat(2),    linkat(2),    mkdirat(2),    mknodat(2),
       name_to_handle_at(2), readlinkat(2), renameat(2), symlinkat(2), unlinkat(2), utimensat(2), mkfifoat(3) et
       scandirat(3))  sont  pris  en  charge pour deux raisons. L'explication est ici donnée dans le contexte de
       l'appel openat(), mais des arguments analogues sont valables 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().  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 openat().

       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.

   O_DIRECT
       L'attribut O_DIRECT peut imposer, pour des raisons d'alignement, des  restrictions  sur  la  longueur  et
       l'adresse  des  tampons de l'espace utilisateur et des déplacements dans les entrées-sorties de fichiers.
       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. Cependant, il n'y a pas actuellement d'interface indépendante
       du système de fichiers qui permette aux applications de découvrir ces restrictions  pour  un  fichier  ou
       système  de  fichiers  donné.  Certains systèmes de fichiers fournissent leur propre interface pour faire
       cela, comme par exemple l'opération XFS_IOC_DIOINFO de xfsctl(3).

       Sous Linux 2.4, la taille des transferts, l'alignement du tampon et la position dans le  fichier  doivent
       être  des  multiples de la taille de blocs logiques du système de fichiers. Sous Linux 2.6, un alignement
       sur des multiples de 512 octets est suffisant.

       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é dans Linux 2.4.10. Les noyaux plus anciens ignorent simplement cet
       attribut. Certains système de fichiers peuvent ne pas supporter cet  attribut  et  open()  échouera  avec
       l'erreur EINVAL s'il a été 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, qui devrait
       être désactivée par défaut.

              « Ce qui m'a  toujours  dérangé  avec  O_DIRECT  est  que  toute  l'interface  est  stupide  et  a
              probablement  été  conçue  par  un  singe  dérangé,  sous  l'influence  de substances psychotropes
              puissantes. » — Linus.

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.

VOIR AUSSI

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

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».