Provided by: manpages-fr_1.67.0-1_all bug

NOM

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

DESCRIPTION

       L’appel-système   open()   sert   à  convertir  un  chemin  d’accès  en
       descripteur de fichier (un petit entier non négatif utilisable pour les
       opérations  d’entrées/sorties  ultérieures  telles  read, write, etc.).
       Lorsque l’appel-système réussit, le descripteur renvoyé  sera  le  plus
       petit  descripteur  de fichier non encore ouvert pour le processus. Cet
       appel  crée  un  nouveau  descripteur,  non-partagé  avec  les   autres
       processus.  Toutefois,  le partage de fichiers ouverts peut se produire
       avec l’appel-système fork(2)).  Le nouveau descripteur de  fichier  est
       configuré  pour  rester  ouvert  au  travers  des  fonctions exec (voir
       fntl(2)).  Le pointeur de position dans le  fichier  est  placé  à  son
       début.

       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.  À cette valeur peut être ajouté
       un ou plusieurs attributs avec un OU binaire :

       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 (ceci dépend du système
              de fichiers, des options  de  montage,  du  mode  du  répertoire
              parent,  etc.) Voir par exemple les options de montage bsdgroups
              et sysvgroups du système de fichiers ext2, décrites dans la page
              mount(8)).

       O_EXCL En  conjonction  avec  O_CREAT,  déclenchera  une  erreur  si le
              fichier existe,  et  open  échouera.  On  considère  qu’un  lien
              symbolique  existe, quelque soit l’endroit où il pointe.  O_EXCL
              ne  fonctionne  pas  sur  les  systèmes  de  fichiers  NFS.  Les
              programmes   qui   ont   besoin  de  cette  fonctionnalité  pour
              verrouiller des tâches risquent de  rencontrer  une  concurrence
              critique  (race  condition).  La  solution  consiste  à 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), utiliser link(2) pour créer un lien
              sur un fichier de verrouillage  et  d’utiliser  stat(2)  sur  ce
              fichier  unique  pour  vérifier si le nombre de liens a augmenté
              jusqu’à 2. Ne pas utiliser la valeur de retour de link().

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

       O_TRUNC
              Si  le fichier existe, est un fichier régulier, et est ouvert en
              é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).

       O_APPEND
              Le  fichier est ouvert en mode « ajout ». Initialement, et avant
              chaque write, la tête de lecture/écriture est placée à la fin du
              fichier  comme  avec  lseek.   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 client est obligé de la simuler, avec  un  risque
              de concurrence des tâches.

       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(4).   Ce  mode  n’a
              pas nécessairement d’effet sur autre chose que les FIFO.

       O_SYNC Le  fichier  est ouvert en écriture synchronisée. Chaque appel à
              write 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 RESTRICTIONS plus bas).

       O_NOFOLLOW
              Si pathname est un lien symbolique, l’ouverture échoue. Ceci 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. Les en-têtes
              de glibc 2.0.100 et suivant contiennent une  définition  de  cet
              attribut.   Les noyaux antérieurs au 2.1.126 ignorent simplement
              cet attribut si vous €™utilisez.

       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. Cet attribut ne devrait jamais être utilisé ailleurs  que
              dans l’implémentation de opendir.

       O_DIRECT
              Essayer  de minimiser les effets du cache d’entrée-sortie sur ce
              fichier.  Ceci dégradera en général les performances,  mais  est
              utilisé  dans des situations spéciales, lorsque les applications
              ont leur propres caches.  Les entrées-sorties dans le fichier se
              font   directement   depuis  l’espace  utilisateur,  elles  sont
              synchrones (à la fin de read(2) ou  write(2),  les  données  ont
              obligatoirement  été  transférées).  La  taille  des transferts,
              l’alignement du buffer et la position dans  le  fichier  doivent
              être  des multiples de la taille de blocs logiques du système de
              fichiers.
              Une interface à la sémantique similaire pour  les  périphériques
              de type bloc est décrite à la page raw(8).

       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, pseudo-terminaux et sockets.  Voir fcntl(2) pour plus
              de détails.

       O_LARGEFILE
              Sur les systèmes 32 bits qui supportent les Systèmes de Fichiers
              Larges, autoriser quand même l’ouverture des  fichiers  dont  la
              taille ne peut pas être représentée sur 31 bits.

       Certains de ces attributs optionnels peuvent être modifiés par la suite
       avec la fonction fcntl.

       L’argument mode indique  les  permissions  à  utiliser  si  un  nouveau
       fichier   est  créé.   Cette  valeur  est  modifiée  par  le  umask  du
       processus : la véritable valeur utilisée est (mode  &  ~umask).   Notez
       que   ce   mode  ne  s’applique  qu’aux  accès  ultérieurs  du  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 (S_IREAD)
              00400 L’utilisateur a l’autorisation de lecture.

       S_IWUSR (S_IWRITE)
              00200 L’utilisateur a l’autorisation d’écriture.

       S_IXUSR (S_IEXEC)
              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.

       Le  mode  devrait  toujours  être  indiqué  quand  O_CREAT est dans les
       attributs flags, (il est ignoré dans les autres cas).

       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.   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,  c’est  parce que 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 atime, ctime, mtime sont fixés
       à l’heure actuelle, ainsi que ctime  et  mtime  du  répertoire  parent.
       Sinon,  si  le  fichier  est modifié à cause de l’attribut O_TRUNC, ses
       champs ctime et mtime sont remplis avec l’heure actuelle.

ERREURS

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

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

       EACCES L’accès demandé au fichier est interdit, ou l’un des répertoires
              du chemin pathname ne permet pas de consultation, ou le  fichier
              n’existe pas mais le répertoire parent ne permet pas l’écriture.

       ENAMETOOLONG
              pathname est trop long.

       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.

       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  noeud  spécial  et  il  n’y  a  pas   de   périphérique
              correspondant.

       ENODEV pathname  correspond  à  un  fichier  spécial et il n’y a pas de
              périphérique correspondant.

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

       EFAULT pathname pointe en dehors de l’espace d’adressage accessible.

       ELOOP  pathname contient une référence circulaire (à  travers  un  lien
              symbolique),  ou  l’attribut  O_NOFOLLOW est indiqué et pathname
              est un lien symbolique.

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

       ENOMEM Pas assez de mémoire pour le noyau.

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

       ENFILE La limite du nombre total de fichiers ouverts sur le système est
              atteinte.

NOTE

       Sous Linux, le drapeau 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).

CONFORMITÉ

       SVr4,  SVID,  POSIX,  X/OPEN,  BSD  4.3.   Les  attributs O_NOFOLLOW et
       O_DIRECTORY sont spécifiques à Linux.  Il  faut  définir  la  constante
       symbolique   _GNU_SOURCE   pour   avoir   leurs  définitions.   L’effet
       (indéfini) de O_RDONLY | O_TRUNC varie suivant les implémentations. Sur
       de nombreux systèmes, le ficier est effectivement tronqué.

       L’attribut O_DIRECT a été introduit par SGI IRIX, qui a des restritions
       d’alignement identiques à Linux. 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.  Le
       support  a  été  ajouté  dans  Linux  2.4.10.   Les noyaux plus anciens
       ignorent simplement cet attribut.

BOGUES

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

RESTRICTIONS

       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.1.130) elles sont toutes équivalentes sous Linux.

VOIR AUSSI

       read(2),  write(2),  fcntl(2),  close(2),  link(2), mknod(2), mount(2),
       stat(2), umask(2), unlink(2), socket(2), fopen(3), fifo(4)

TRADUCTION

       Christophe Blaess, 1996-2003.