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);
É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 spécifique à
Linux et décrit ci-dessous permet de modifier ce comportement par
défaut. La position dans le fichier est fixée au début du fichier (voir
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 plus d’attributs de création de fichier et d’attributs
d’état de fichier peuvent être spécifiés dans flags avec un OU binaire.
Les attributs de création de fichier sont O_CREAT, O_EXCL, O_NOCTTY et
O_TRUNC. Les attributs d’état de fichier sont tous les autres attributs
listé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 avec fcntl(2). 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, pseudo-terminaux, sockets et (depuis Linux 2.6) tubes
et FIFO. Voir fcntl(2) pour plus de détails.
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 (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 décrites dans la page mount(8)).
Le paramètre mode indique les permissions à utiliser si un
nouveau fichier est créé. Ce paramètre doit être fourni quand
O_CREAT est spécifié dans les flags ; si O_CREAT n’est pas
précisé, mode est ignoré. Les permissions effectives sont
modifiées 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 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. Ceci dégradera en général les performances, mais est
utilisé dans des situations spéciales, lorsque les applications
ont leur propres caches. L’ajout du drapeau O_DIRECT fait que
les entrées-sorties sont synchrones ; en réalité un effort est
fait pour rendre le transfert synchrone mais cela ne done pas la
garantie fournie par le drapeau O_SYNC que les données et
méta-données sont transférées. Pour garantir des entrées-sorties
synchrones, le drapeau O_SYNC doit être utilisé en plus du
drapeau O_DIRECT. Consultez la section NOTES ci-dessous.
Une interface à la sémantique similaire (mais dépréciée) pour
les périphériques de type bloc 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. Cet attribut ne devrait jamais être utilisé ailleurs que
dans l’implémentation de opendir(3).
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. Le comportement de O_EXCL est
indéterminé si O_CREAT n’est pas spécifié.
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.
O_EXCL n’est pris en charge sur les systèmes de fichiers NFS
quand la version NFSv3, ou ultérieure, sur les noyaux 2.6 ou
plus récents. Dans les environnements où la prise en charge de
O_EXCL pour NFS 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 pour
obtenir cette définition. Fixer 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
(voir 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 — 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_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.
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_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_TRUNC
Si le fichier existe, est un fichier ordinaire, 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).
Certains de ces attributs optionnels peuvent être modifiés par la suite
avec la fonction fcntl(2).
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. (Voir aussi
path_resolution(7).)
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 Voir EOVERFLOW.
EINTR Pendant qu’il était bloqué en attente de l’ouverture d’un
périphérique lent (par exemple, une FIFO ; voir fifo(7)),
l’appel a été interrompu par un gestionnaire de signal ; voir
signal(7).
EISDIR On a demandé une écriture alors que pathname correspond à un
répertoire (en fait, O_WRONLY ou O_RDWR ont été demandés).
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.
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 noeud spécial et il n’y a pas de périphérique
correspondant.
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 (voir fcntl(2)).
CONFORMITÉ
SVr4, BSD 4.3, POSIX.1-2001. Les attributs O_DIRECTORY, O_NOATIME et
O_NOFOLLOW sont spécifiques à Linux; il faut définir la macro
_GNU_SOURCE pour avoir leurs définitions.
L’attribut O_CLOEXEC n’est pas spécifié dans POSIX.1-2001, mais l’est
dans POSIX.1-2008.
O_DIRECT n’est pas spécifié par POSIX ; il faut définir la macro
_GNU_SOURCE pour obtenir sa définition.
NOTES
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).
Contrairement aux autres valeurs qui peuvent être indiquées dans flags,
les valeurs du mode daccs 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 drapeaux O_SYNC, O_DSYNC et O_RSYNC.
Actuellement (2.63.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 ; voir stat(2)) sont fixés à
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.
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.
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), feature_test_macros(7),
fifo(7), path_resolution(7), symlink(7)
COLOPHON
Cette page fait partie de la publication 3.23 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
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
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> ».