table of contents
other languages
other sections
OPEN(2) | Manuel du programmeur Linux | OPEN(2) |
NOM¶
open, creat - Ouvrir ou créer éventuellement un fichier ou un périphériqueSYNOPSIS¶
#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¶
É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 décrit ci-dessous permet de modifier ce comportement par défaut. La position dans le fichier est définie au début du fichier (consultez 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.- 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, pseudoterminaux, sockets et (depuis Linux 2.6) tubes et FIFO. Consultez 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.) Consultez 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. Cela 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.
- 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.
- 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 (avant d'inclure tout fichier d'en‐tête) pour obtenir cette définition. Définir 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 (consultez 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 — consultez 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).
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. (Consultez 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
- Consultez EOVERFLOW.
- EINTR
- Pendant qu'il était bloqué en attente de l'ouverture d'un périphérique lent (par exemple, une FIFO ; consultez fifo(7)), l'appel a été interrompu par un gestionnaire de signal ; consultez 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 nœud 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 (consultez 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 (avant d'inclure tout fichier d'en‐tête) pour avoir leurs définitions.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).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. Les E/S O_DIRECT ne devraient jamais être exécutées en même temps que l'appel système fork(2), si le tampon mémoire est une projection privée (c'est-à-dire n'importe quelle projection en mémoire créée avec l'attribut MAP_PRIVATE de mmap(2), y compris la mémoire allouée sur le tas et les tampons alloués de façon statique). Toutes ces E/S, qu'elles soient soumises par l'intermédiaire d'une interface d'E/S asynchrone ou depuis un autre thread du processus, devraient être achevées avant l'appel de fork(2). En cas d'échec, les conséquences pourraient être une corruption de mémoire ou un comportement imprévisible dans les processus père et fils. Cette restriction ne s'applique pas quand le tampon mémoire pour les E/S O_DIRECT a été créé en utilisant shmat(2) ou mmap(2) avec l'attribut MAP_SHARED. Cette restriction ne s'applique pas non plus quand le tampon mémoire a été configuré comme MADV_DONTFORK avec madvise(2), en s'assurant qu'il ne sera pas disponible au fils après fork(2). 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), fifo(7), path_resolution(7), symlink(7)COLOPHON¶
Cette page fait partie de la publication 3.44 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>. Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009). 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> ».1er mai 2012 | Linux |