OPEN(2) Manuel du programmeur Linux OPEN(2)
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
open essaye d'ouvrir un fichier et retourne un descripteur
de fichier (petit entier non négatif à utiliser avec read,
write, etc...)
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.
flags peut aussi être un OU binaire ( | ) avec un ou
plusieurs des éléments suivants :
O_CREAT
Créer le fichier s'il n'existe pas.
O_EXCL En conjonction avec O_CREAT, déclenchera une erreur
si le fichier existe, et open échouera. O_EXCL ne
fonctionne pas sur les systèmes de fichiers NFS.
Les programmes qui ont besoin de cette fonction
nalité pour verrouiller des tâches risquent de ren
contrer 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 termi
nal -- voir tty(4) --, il ne deviendra pas le ter
minal contrôlant le processus même si celui-ci
n'est attaché à aucun autre terminal.
O_TRUNC
Si le fichier existe il sera tronqué.
O_APPEND
Le fichier est ouvert en mode "ajout". Initiale
ment, et avant chaque write, la tête de lec
ture/écriture est placée à la fin du fichier comme
Linux 18 Mai 1999 1
OPEN(2) Manuel du programmeur Linux OPEN(2)
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.
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 pro
prement dit seront suivis normalement. Les en-tête
de glibc 2.0.100 et suivant contiennent une défini
tion de cet attribut.
Les noyaux antérieurs au 2.1.126 ignorent simple
ment 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émenta
tion de opendir.
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. Le noyau Linux
n'offre pas encore de support pour cette option (du
moins jusqu'au 2.1.130), mais la définition de
l'attribut est présente et les interfaces LFS sont
présentes dans les versions de test de glibc 2.1.
Certains de ces attributs optionnels peuvent être modifiés
par la suite avec la fonction fcntl.
Linux 18 Mai 1999 2
OPEN(2) Manuel du programmeur Linux OPEN(2)
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).
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.
Linux 18 Mai 1999 3
OPEN(2) Manuel du programmeur Linux OPEN(2)
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.
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 corre
spond à un répertoire.
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 Un répertoire du chemin d'accès pathname n'existe
pas où est un lien symbolique pointant nulle part.
ENOTDIR
Un élément du chemin d'acces 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 corre
spond à un fichier exécutable actuellement utilisé.
EFAULT pathname pointe en dehors de l'espace d'adressage
Linux 18 Mai 1999 4
OPEN(2) Manuel du programmeur Linux OPEN(2)
accessible
ELOOP pathname contient une référence circulaire (à
travers un lien symbolique), ou l'attribut O_NOFOL
LOW est indiqué et pathname est un lien symbolique.
ENOSPC pathname devrait etre 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
RESTRICTIONS
Plusieurs problèmes se posent avec le protocole NFS, con
cernant entre autres O_SYNC, et O_NDELAY .
POSIX fournit trois variantes différentes des entrées/sor
ties 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), unlink(2),
mknod(2), stat(2), umask(2), mount(2), socket(2),
socket(2), fopen(3), link(2).
TRADUCTION
Christophe Blaess, 1997.
Linux 18 Mai 1999 5