OPEN
Section: Manuel du programmeur Linux (2) Updated: 30 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
BOGUES
RESTRICTIONS
VOIR AUSSI
TRADUCTION
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ée à 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, 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 FIFOs.
- 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ête 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 utilise 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ée 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 devienne possible 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 le client qui 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 fichiers 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.
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.
|