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

NOM

       open, creat - Ouvrir ou créer éventuellement un fichier ou un périphérique

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

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.  Spécifier  cet
              attribut  permet  à  un programme d'éviter des opérations supplémentaires F_SETFD de fcntl(2) pour
              positionner l'attribut FD_CLOEXEC. De plus, l'utilisation de cet  attribut  est  essentielle  dans
              certains  programmes  multithreadés puisque l'utilisation d'une opération F_SETFD de fcntl(2) pour
              positionner l'attribut FD_CLOEXEC  ne  suffit  pas  pour  éviter  les  conditions  de  concurrence
              lorsqu'un  thread  ouvre  un  descripteur  de fichier en même temps qu'un autre thread effectue un
              fork(2) plus un execve(2).

       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 est spécifique  à  Linux  et
              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_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 l'attribut O_NOFOLLOW est également 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 Le fichier est ouvert en écriture synchronisée. Chaque appel à write(2) sur le fichier bloquera le
              processus appelant jusqu'à ce que les données  aient  été  écrites  physiquement  sur  le  support
              matériel (voir la section NOTES plus bas).

       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.

       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() est équivalent à open() avec l'attribut flags égal à O_CREAT | O_WRONLY | O_TRUNC.

VALEUR RENVOYÉE

       open()  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

       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, ou l'attribut O_NOFOLLOW  est
              indiqué et pathname est un lien symbolique.

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

CONFORMITÉ

       SVr4, 4.3BSD, POSIX.1-2001, 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).

       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 mots, la combinaison O_RDONLY
       | O_WRONLY est une erreur logique et n'a certainement pas la même signification que O_RDWR. Linux réserve
       le mode d'accès, particulier et non standard, mode 3 (11 en binaire) à flags  pour  signifier :  vérifier
       les  permissions  de lecture et d'écriture du fichier et renvoyer un descripteur de fichier qui ne pourra
       pas être utilisé pour une lecture ou une écriture. Ce mode d'accès non standard est utilisé par  certains
       pilotes  Linux  pour  renvoyer  un  descripteur  qui  ne  sera  utilisé  que  par des opérations ioctl(2)
       spécifiques au périphérique.

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

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

       POSIX  fournit trois variantes différentes des entrées-sorties synchronisées, correspondant aux attributs
       O_SYNC, O_DSYNC et O_RSYNC. Actuellement (2.6.31), Linux  implémente  seulement  O_SYNC,  mais  la  glibc
       définit  O_DSYNC  et  O_RSYNC  à  la  même  valeur  que O_SYNC. La plupart des systèmes de fichiers Linux
       n'implémentent en fait pas la sémantique  O_SYNC  de  POSIX  (qui  demande  que  les  mises  à  jour  des
       métadonnées d'une écriture soient sur le disque lors du retour en espace utilisateur), mais la sémantique
       O_DSYNC (qui ne demande uniquement que les données des fichiers et les métadonnées nécessaires  pour  les
       retrouvées soit sur le disque au moment ou l'appel système rend la main).

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

       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.

       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.

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

VOIR AUSSI

       chmod(2),   chown(2),  close(2),  dup(2),  fcntl(2),  link(2),  lseek(2),  mknod(2),  mmap(2),  mount(2),
       openat(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.57 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> ».