Provided by:
manpages-fr_1.67.0-1_all 
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 l’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.