Provided by:
manpages-fr-dev_3.32d0.2p4-1_all 
NOM
open, creat - Ouvrir ou creer eventuellement un fichier ou un
peripherique
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
Etant donne le chemin pathname d'un fichier, open() renvoie un
descripteur de fichier (petit entier positif ou nul) qui pourra ensuite
etre utilise dans d'autres appels systeme (read(2), write(2), lseek(2),
fcntl(2), etc.). Le descripteur de fichier renvoye par un appel reussi
sera le plus petit descripteur de fichier non actuellement ouvert par
le processus.
Par defaut, le nouveau descripteur de fichier est configure pour rester
ouvert apres un appel a execve(2) (son attribut FD_CLOEXEC decrit dans
fcntl(2) est initialement desactive). L'attribut O_CLOEXEC specifique a
Linux et decrit ci-dessous permet de modifier ce comportement par
defaut. La position dans le fichier est fixee au debut du fichier
(consultez lseek(2)).
Un appel a open() cree une nouvelle description de fichier ouvert, une
entree dans la table de fichiers ouverts du systeme. Cette entree
enregistre la position dans le fichier et les attributs d'etat du
fichier (modifiables par l'operation F_SETFL de fcntl(2)). Un
descripteur de fichier est une reference a l'une de ces entrees ; cette
reference n'est pas modifiee si pathname est ensuite supprime ou
modifie pour correspondre a un autre fichier. La nouvelle description
de fichier ouvert n'est initialement partagee avec aucun autre
processus, mais ce partage peut apparaitre apres un fork(2).
Le parametre flags est l'un des elements O_RDONLY, O_WRONLY ou O_RDWR
qui reclament respectivement l'ouverture du fichier en lecture seule,
ecriture seule, ou lecture/ecriture.
De plus, zero ou plus d'attributs de creation de fichier et d'attributs
d'etat de fichier peuvent etre specifies dans flags avec un OU binaire.
Les attributs de creation de fichier sont O_CREAT, O_EXCL, O_NOCTTY et
O_TRUNC. Les attributs d'etat de fichier sont tous les autres attributs
listes ci-dessous. La distinction entre ces deux groupes est que les
attributs d'etat de fichier peuvent etre lus et (dans certains cas)
modifies avec fcntl(2). La liste complete des attributs de creation et
d'etat de fichier est la suivante :
O_APPEND
Le fichier est ouvert en mode << ajout >>. Initialement, et
avant chaque write(2), la tete de lecture/ecriture est placee a
la fin du fichier comme avec lseek(2). Il y a un risque
d'endommager le fichier lorsque O_APPEND est utilise, sur un
systeme de fichiers NFS, si plusieurs processus tentent
d'ajouter des donnees simultanement au meme fichier. Ceci est du
au fait que NFS ne supporte pas l'operation d'ajout de donnees
dans un fichier, aussi le noyau du client est oblige de la
simuler, avec un risque de concurrence des taches.
O_ASYNC
Declencher un signal (SIGIO par defaut, mais peut etre change
via fcntl(2)) lorsque la lecture ou l'ecriture deviennent
possibles sur ce descripteur. Ceci n'est possible que pour les
terminaux, pseudoterminaux, sockets et (depuis Linux 2.6) tubes
et FIFO. Consultez fcntl(2) pour plus de details.
O_CLOEXEC (Depuis Linux 2.6.23)
Activer l'attribut << close-on-exec >> pour le nouveau
descripteur de fichier. Specifier cet attribut permet a un
programme d'eviter des operations supplementaires F_SETFD de
fcntl(2) pour positionner l'attribut FD_CLOEXEC. De plus,
l'utilisation de cet attribut est essentielle dans certains
programmes multithreades puisque l'utilisation d'une operation
F_SETFD de fcntl(2) pour positionner l'attribut FD_CLOEXEC ne
suffit pas pour eviter les conditions de concurrence lorsqu'un
thread ouvre un descripteur de fichier en meme temps qu'un autre
thread effectue un fork(2) plus un execve(2).
O_CREAT
Creer le fichier s'il n'existe pas. Le possesseur (UID) du
fichier est renseigne avec l'UID effectif du processus. Le
groupe proprietaire (GID) du fichier est le GID effectif du
processus ou le GID du repertoire parent (ceci depend du systeme
de fichiers, des options de montage, du mode du repertoire
parent, etc.) Consultez par exemple les options de montage
bsdgroups et sysvgroups decrites dans la page mount(8)).
Le parametre mode indique les permissions a utiliser si un
nouveau fichier est cree. Ce parametre doit etre fourni quand
O_CREAT est specifie dans les flags ; si O_CREAT n'est pas
precise, mode est ignore. Les permissions effectives sont
modifiees par le umask du processus : la veritable valeur
utilisee est (mode & ~umask). Notez que ce mode ne s'applique
qu'aux acces ulterieurs au fichier nouvellement cree. L'appel
open() qui cree un fichier dont le mode est en lecture seule
fournira quand meme un descripteur de fichier en lecture et
ecriture.
Les constantes symboliques suivantes sont disponibles pour
mode :
S_IRWXU 00700 L'utilisateur (proprietaire du fichier) a les
autorisations de lecture, ecriture, execution.
S_IRUSR 00400 L'utilisateur a l'autorisation de lecture.
S_IWUSR 00200 L'utilisateur a l'autorisation d'ecriture.
S_IXUSR 00100 L'utilisateur a l'autorisation d'execution.
S_IRWXG 00070 Le groupe a les autorisations de lecture,
ecriture, execution.
S_IRGRP 00040 Le groupe a l'autorisation de lecture.
S_IWGRP 00020 Le groupe a l'autorisation d'ecriture.
S_IXGRP 00010 Le groupe a l'autorisation d'execution.
S_IRWXO 00007 Tout le monde a les autorisations de lecture,
ecriture, execution.
S_IROTH 00004 Tout le monde a l'autorisation de lecture.
S_IWOTH 00002 Tout le monde a l'autorisation d'ecriture.
S_IXOTH 00001 Tout le monde a l'autorisation d'execution.
O_DIRECT (Depuis Linux 2.4.10)
Essayer de minimiser les effets du cache d'entree-sortie sur ce
fichier. Ceci degradera en general les performances, mais est
utilise dans des situations speciales, lorsque les applications
ont leur propres caches. L'ajout du drapeau O_DIRECT fait que
les entrees-sorties sont synchrones ; en realite un effort est
fait pour rendre le transfert synchrone mais cela ne done pas la
garantie fournie par le drapeau O_SYNC que les donnees et
meta-donnees sont transferees. Pour garantir des entrees-sorties
synchrones, le drapeau O_SYNC doit etre utilise en plus du
drapeau O_DIRECT. Consultez la section NOTES ci-dessous.
Une interface a la semantique similaire (mais depreciee) pour
les peripheriques blocs est decrite a la page raw(8).
O_DIRECTORY
Si pathname n'est pas un repertoire, l'ouverture echoue. Cet
attribut est specifique a Linux et fut ajoute dans la version
2.1.126 du noyau, pour eviter des problemes de dysfonctionnement
si opendir(3) est invoque sur une FIFO ou un peripherique de
bande. Cet attribut ne devrait jamais etre utilise ailleurs que
dans l'implementation de opendir(3).
O_EXCL S'assurer que cet appel cree le fichier : si cet attribut est
specifie en conjonction avec O_CREAT et si le fichier pathname
existe deja, open() echouera.
Lorsque ces deux attributs sont specifies, les liens symboliques
ne sont pas suivis : si pathname est un lien symbolique, open()
echouera quelque soit l'endroit ou pointe le lien symbolique.
En general, le comportement de O_EXCL est indetermine s'il est
utilise sans O_CREAT. Il existe une exception toutefois : a
partir de Linux 2.6, O_EXCL peut etre utilise sans O_CREAT si
pathname fait reference a un peripherique bloc. Si le
peripherique bloc est utilise par le systeme (par exemple, s'il
est monte), open() echoue avec l'erreur EBUSY.
Sur les systemes de fichiers NFS, O_EXCL n'est pris en charge
qu'avec la version NFSv3 ou ulterieure, sur les noyaux 2.6 ou
plus recents. Dans les environnements NFS ou la prise en charge
d'O_EXCL n'est pas fournie, les programmes qui ont besoin de
cette fonctionnalite pour verrouiller des taches 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
eviter la dependance de la prise en charge NFS pour O_EXCL
peuvent creer un fichier unique sur le meme systeme de fichiers
(par exemple, avec le PID et le nom de l'hote), et utiliser
link(2) pour creer un lien sur un fichier de verrouillage. Si
link(2) renvoie 0, le verrouillage est reussi. Sinon, utiliser
stat(2) sur ce fichier unique pour verifier si le nombre de
liens a augmente jusqu'a 2, auquel cas le verrouillage est
egalement reussi.pour verifier si le nombre de liens a augmente
jusqu'a 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
etre representee dans un off_t (mais peut l'etre dans un
off64_t). La macro _LARGEFILE64_SOURCE doit etre definie (avant
d'inclure tout fichier d'en-tete) pour obtenir cette definition.
Fixer la macro _FILE_OFFSET_BITS a 64 est la methode a favoriser
pour acceder a des grands fichiers sur des systemes 32 bits,
plutot que d'utiliser O_LARGEFILE (consultez
feature_test_macros(7)).
O_NOATIME (Depuis Linux 2.6.8)
Ne pas mettre a jour l'heure de dernier acces au fichier (champ
st_atime de l'inoeud) quand le fichier est lu avec read(2). Ce
attribut est seulement concu pour les programmes d'indexation et
d'archivage, pour lesquels il peut reduire significativement
l'activite du disque. L'attribut peut ne pas etre effectif sur
tous les systemes de fichiers. Par exemple, avec NFS, l'heure
d'acces est mise a jour par le serveur.
O_NOCTTY
Si pathname correspond a un peripherique de terminal --
consultez tty(4) --, il ne deviendra pas le terminal controlant
le processus meme si celui-ci n'est attache a aucun autre
terminal.
O_NOFOLLOW
Si pathname est un lien symbolique, l'ouverture echoue. Ceci est
une extension FreeBSD, qui fut ajoutee a Linux dans la version
2.1.126. Les liens symboliques se trouvant dans le chemin
d'acces 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 operation ulterieure sur ce fichier ne
laissera le processus appelant en attente. Pour la manipulation
des FIFO (tubes nommes), voir egalement fifo(7). Pour une
explication de l'effet de O_NONBLOCK en conjonction avec les
verrouillages imperatifs et les baux de fichiers, voir fcntl(2).
O_SYNC Le fichier est ouvert en ecriture synchronisee. Chaque appel a
write(2) sur le fichier bloquera le processus appelant jusqu'a
ce que les donnees aient ete ecrites physiquement sur le support
materiel (voir la section NOTES plus bas).
O_TRUNC
Si le fichier existe, est un fichier ordinaire, et est ouvert en
ecriture (O_RDWR ou O_WRONLY), il sera tronque a une longueur
nulle. Si le fichier est une FIFO ou un peripherique terminal,
l'attribut O_TRUNC est ignore. Sinon, le comportement de O_TRUNC
n'est pas precise. Sur de nombreuses versions de Linux, il sera
ignore ; sur d'autres versions il declenchera une erreur).
Certains de ces attributs optionnels peuvent etre modifies par la suite
avec la fonction fcntl(2).
creat() est equivalent a open() avec l'attribut flags egal a O_CREAT |
O_WRONLY | O_TRUNC.
VALEUR RENVOY'EE
open() et creat() renvoient le nouveau descripteur de fichier s'ils
reussissent, ou -1 s'ils echouent, auquel cas errno contient le code
d'erreur.
ERREURS
EACCES L'acces demande au fichier est interdit, ou la permission de
parcours pour l'un des repertoires du chemin pathname est
refusee, ou le fichier n'existe pas encore et le repertoire
parent ne permet pas l'ecriture. (Consultez aussi
path_resolution(7).)
EEXIST pathname existe deja et O_CREAT et O_EXCL ont ete indiques.
EFAULT pathname pointe en-dehors de l'espace d'adressage accessible.
EFBIG Consultez EOVERFLOW.
EINTR Pendant qu'il etait bloque en attente de l'ouverture d'un
peripherique lent (par exemple, une FIFO ; consultez fifo(7)),
l'appel a ete interrompu par un gestionnaire de signal ;
consultez signal(7).
EISDIR On a demande une ecriture alors que pathname correspond a un
repertoire (en fait, O_WRONLY ou O_RDWR ont ete demandes).
ELOOP Trop de liens symboliques ont ete rencontres en parcourant
pathname, ou l'attribut O_NOFOLLOW est indique et pathname est
un lien symbolique.
EMFILE Le processus a deja ouvert le nombre maximal de fichiers.
ENAMETOOLONG
pathname est trop long.
ENFILE La limite du nombre total de fichiers ouverts sur le systeme a
ete atteinte.
ENODEV pathname correspond a un fichier special et il n'y a pas de
peripherique correspondant. (Ceci est un bogue du noyau Linux ;
dans cette situation, ENXIO devrait etre renvoye.)
ENOENT O_CREAT est absent et le fichier n'existe pas. Ou un repertoire
du chemin d'acces pathname n'existe pas, ou est un lien
symbolique pointant nulle part.
ENOMEM Pas assez de memoire pour le noyau.
ENOSPC pathname devrait etre cree mais le peripherique concerne n'a
plus assez de place pour un nouveau fichier.
ENOTDIR
Un element du chemin d'acces pathname n'est pas un repertoire,
ou l'attribut O_DIRECTORY est utilise et pathname n'est pas un
repertoire.
ENXIO O_NONBLOCK | O_WRONLY est indique, le fichier est une FIFO et le
processus n'a pas de fichier ouvert en lecture. Ou le fichier
est un noeud special et il n'y a pas de peripherique
correspondant.
EOVERFLOW
pathname fait reference a un fichier ordinaire qui est trop
grand pour etre ouvert. Cela arrive quand une application
compilee sur une plate-forme 32 bits sans -D_FILE_OFFSET_BITS=64
essaie d'ouvrir un fichier dont la taille depasse (2<<31)-1
bits ; consultez egalement O_LARGEFILE ci-dessus. C'est l'erreur
specifiee par POSIX.1-2001 ; dans les noyaux anterieurs a la
version 2.6.24, Linux fournissait l'erreur EFBIG dans ce cas.
EPERM L'attribut O_NOATIME est indique, mais l'UID effectif de
l'appelant n'est pas le proprietaire du fichier, et l'appelant
n'est pas privilegie (CAP_FOWNER).
EROFS Un acces en ecriture est demande alors que pathname reside sur
un systeme de fichiers en lecture seule.
ETXTBSY
On a demande une ecriture alors que pathname correspond a un
fichier executable actuellement utilise.
EWOULDBLOCK
L'attribut O_NONBLOCK est indique, et un bail incompatible est
detenu sur le fichier (consultez fcntl(2)).
CONFORMIT'E
SVr4, BSD 4.3, POSIX.1-2001. Les attributs O_DIRECTORY, O_NOATIME et
O_NOFOLLOW sont specifiques a Linux; il faut definir la macro
_GNU_SOURCE (avant d'inclure tout fichier d'en-tete) pour avoir leurs
definitions.
L'attribut O_CLOEXEC n'est pas specifie dans POSIX.1-2001, mais l'est
dans POSIX.1-2008.
O_DIRECT n'est pas specifie par POSIX ; il faut definir la macro
_GNU_SOURCE (avant d'inclure tout fichier d'en-tete) pour obtenir sa
definition.
NOTES
Sous Linux, le drapeau O_NONBLOCK indique que l'on veut ouvrir mais pas
necessairement dans l'intention de lire ou d'ecrire. Il est typiquement
utilise pour ouvrir des peripheriques dans le but de recuperer un
descripteur de fichier pour l'utiliser avec ioctl(2).
Contrairement aux autres valeurs qui peuvent etre indiquees dans flags,
les valeurs du mode d'acc`es O_RDONLY, O_WRONLY et O_RDWR ne sont pas
des bits individuels. Ils definissent 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 meme signification que O_RDWR. Linux reserve le
mode d'acces, particulier et non standard, mode 3 (11 en binaire) a
flags pour signifier : verifier les permissions de lecture et
d'ecriture du fichier et renvoyer un descripteur de fichier qui ne
pourra pas etre utilise pour une lecture ou une ecriture. Ce mode
d'acces non standard est utilise par certains pilotes Linux pour
renvoyer un descripteur qui ne sera utilise que par des operations
ioctl(2) specifiques au peripherique.
L'effet (indefini) de O_RDONLY | O_TRUNC varie selon l'implementation.
Sur de nombreux systemes, le fichier est effectivement tronque.
Plusieurs problemes se posent avec le protocole NFS, concernant entre
autres O_SYNC, et O_NDELAY .
POSIX fournit trois variantes differentes des entrees-sorties
synchronisees, correspondant aux drapeaux O_SYNC, O_DSYNC et O_RSYNC.
Actuellement (2.63.31), Linux implemente seulement O_SYNC, mais la
glibc definit O_DSYNC et O_RSYNC a la meme valeur que O_SYNC. La
plupart des systemes de fichiers Linux n'implementent en fait pas la
semantique O_SYNC de POSIX (qui demande que les mises a jour des
metadonnees d'une ecriture soient sur le disque lors du retour en
espace utilisateur), mais la semantique O_DSYNC (qui ne demande
uniquement que les donnees des fichiers et les metadonnees necessaires
pour les retrouvees soit sur le disque au moment ou l'appel systeme
rend la main).
Notez que open() peut ouvrir des fichiers speciaux mais creat() ne peut
pas en creer, il faut utiliser mknod(2) a la place.
Sur les systemes de fichiers NFS, ou la correspondance d'UID est
activee, open() peut renvoyer un descripteur de fichier alors qu'une
requete read(2) par exemple sera refusee avec le code d'erreur EACCES.
En effet, le client a effectue open() en verifiant les autorisations
d'acces, mais la correspondance d'UID est calculee par le serveur au
moment des requetes de lecture ou d'ecriture.
Si un fichier est cree, ses horodatages st_atime, st_ctime, st_mtime
(respectivement heure de dernier acces, de derniere modification
d'etat, et de derniere modification ; consultez stat(2)) sont fixes a
l'heure actuelle, ainsi que les champs st_ctime et st_mtime du
repertoire parent. Sinon, si le fichier est modifie a 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 deplacements dans les entrees-sorties de fichiers.
Sous Linux, les restrictions d'alignement varient en fonction du
systeme 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
independante du systeme de fichiers qui permette aux applications de
decouvrir ces restrictions pour un fichier ou systeme de fichiers
donne. Certains systemes de fichiers fournissent leur propre interface
pour faire cela, comme par exemple l'operation 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 etre des multiples de la taille de
blocs logiques du systeme de fichiers. Sous Linux 2.6, un alignement
sur des multiples de 512 octets est suffisant.
L'attribut O_DIRECT a ete introduit par SGI IRIX, qui a des
restrictions d'alignement identiques a Linux 2.4. IRIX a aussi un appel
fcntl(2) pour obtenir les alignements et tailles appropries. FreeBSD
4.x a introduit un attribut du meme nom, mais sans les restrictions
d'alignement.
La gestion de O_DIRECT a ete ajoute dans Linux 2.4.10. Les noyaux plus
anciens ignorent simplement cet attribut. Certains systeme de fichiers
peuvent ne pas supporter cet attribut et open() echouera avec l'erreur
EINVAL s'il a ete utilise.
Les applications devraient eviter de melanger des entrees-sorties
O_DIRECT et normales pour le meme fichier, en particulier sur des
regions d'un meme fichier qui se recouvrent. Meme si le systeme de
fichiers gere les problemes de coherence dans cette situation, le debit
global d'entrees-sorties sera moindre que si un seul mode etait
utilise. De la meme facon, les applications devraient eviter de
melanger l'utilisation de mmap(2) et d'entrees-sorties directes pour
les memes fichiers.
Le comportement de O_DIRECT avec NFS differe des systemes de fichiers
locaux. Les anciens noyaux, ou les noyaux configures d'une certaine
facon, peuvent ne pas gerer cette combinaison. Le protocole NFS ne gere
pas le passage de l'attribut au serveur, les entrees-sorties O_DIRECT
ne font donc que le cache des pages du client ; le serveur pourra
toujours utiliser un cache pour les entrees-sorties. Le client demande
au serveur de rendre les entrees-sorties synchrones pour preserver la
semantique synchrone de O_DIRECT. Certains serveurs fonctionnent mal
dans ces circonstances, tout particulierement si les entrees-sorties
sont de petite taille. Certains serveurs peuvent aussi etre configures
pour mentir aux clients et indiquer que les entrees-sorties ont atteint
un espace de stockage stable ; ceci evitera la perte de performance en
augmentant les risques pour l'integrite des donnees en cas de probleme
d'alimentation du serveur. Le client NFS Linux n'a pas de restriction
d'alignement pour les entrees-sorties O_DIRECT.
En resume, O_DIRECT est un outil potentiellement puissant qui doit etre
utilise avec precaution. Les applications devraient utiliser O_DIRECT
comme une option pour ameliorer les performances, qui devrait etre
desactivee par defaut.
<< Ce qui m'a toujours derange avec O_DIRECT est que toute
l'interface est stupide et a probablement ete concue par un
singe derange, sous l'influence de substances psychotropes
puissantes >>. -- Linus.
BOGUES
Actuellement, il n'est pas possible d'activer les entrees-sorties
controlees 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), fifo(7), path_resolution(7),
symlink(7)
COLOPHON
Cette page fait partie de la publication 3.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.