| | |
open, creat - Ouvrir ou créer éventuellement
un fichier.
#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);
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 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 il sera tronqué.
- 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.
- 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_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.
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.
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.
- 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.
- 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 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.
SVr4, SVID, POSIX, X/OPEN, BSD 4.3
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.
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)
.
Christophe Blaess, 1997.
Table des matières
© 1996-2000 Adaptation française "Christophe Blaess"
| |