open | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#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 | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Par défaut, le nouveau descripteur de fichier est configuré pour rester ouvert au travers d'un execve(2) (c'est-à-dire que l'attribut FD_CLOEXEC du descripteur de fichier, décrit dans fcntl(2), est initialement désactivé ; l'attribut O_CLOEXEC, spécifique à Linux, peut être utilisé pour modifier ce comportement par défaut ). Le pointeur de position dans le fichier est placé à son début (voir lseek(2)).
Un appel à open() crée une nouvelle description de fichier ouvert, une entrée dans la table des fichiers ouverts à l'échelle du système. Cette entrée enregistre le décalage du fichier et les attributs d'état du fichier (modifiable via l'opération F_SETFL de fcntl(2). Un descripteur de fichier est une référence vers l'une de ces entrées ; cette référence n'est pas affectée si pathname est ultérieurement supprimé ou modifié pour se référer à un fichier différent. La nouvelle description de fichier n'est initialement pas partagée avec un autre processus, mais le partage peut survenir via fork(2).
Le paramètre flags doit inclure l'un des mode d'accès suivants : O_RDONLY, O_WRONLY ou O_RDWR. Ceux-ci réclament respectivement l'ouverture du fichier en lecture seule, écriture seule, ou lecture-écriture. À cette valeur peut être ajouté zéro ou plusieurs attributs de création de fichier et attributs d'état de fichier avec un OU binaire. Les attributs de création de fichier sont O_CREAT, O_EXCL, O_NOCTTY, et O_TRUNC. Les attributs d'état de fichier sont tous les autres attributs restant listés plus loin. La différence entre ces deux groupes d'attributs est que l'on peut récupérer et (dans certains cas) modifier avec fcntl(2) les attributs d'état de fichier. La liste complète des attributs de création de fichier et des attributs d'état de fichier est la suivante :
mode indique les permissions à utiliser si un nouveau fichier est créé. Cet argument doit être fourni lorsque O_CREAT est spécifié dans flags ; si O_CREAT n'est pas spécifié, mode est ignoré. Les permissions effectives sont modifiées par l'umask du processus de manière classique : les permissions du fichiers sont créé sont (mode & ~umask). Veuillez noter 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 :
Une interface à la sémantique similaire (mais dépréciée) pour les périphériques de type bloc est décrite à la page raw(8).
Lorsque ces deux attributs sont spécifiés, les liens symboliques ne sont suivis : si pathname est un lien symbolique, open() échouera quelque soit l'endroit où pointe le lien symbolique.
O_EXCL n'est pas pris en charge sur les systèmes de fichiers NFS version 2 (NFSv2) ou sous Linux avant le noyau 2.6. Il est pris en charge depuis Linux 2.6 avec NFSv3 ou plus récent. Dans les environnements où la prise en charge de O_EXCL pour NFS n'est pas fournie, les programmes qui ont besoin de cette fonctionnalité pour verrouiller des tâches 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 éviter la dépendance de la prise en charge NFS pour O_EXCL peuvent 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), et 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(2).
Certains de ces attributs optionnels peuvent être modifiés par la suite avec la fonction fcntl(2).
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 :
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 | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'attribut O_CLOEXEC n'est pas spécifié par POSIX.1-2001, mais il est prévu de l'inclure dans la prochaine révision de la norme ; il faut définir la macro _GNU_SOURCE pour obtenir sa définition.
O_DIRECT n'est pas spécifié par POSIX ; il faut définir la constante symbolique _GNU_SOURCE pour avoir sa définition.
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
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. 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 parce que le client a 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 fichier est créé, ses horodatages st_atime, st_ctime, st_mtime (respectivement horodatage du dernier accès, horodatage du dernier changement d'état, horodatage de la dernière modification) sont fixés à l'heure actuelle, ainsi que les champs st_ctime et st_mtime du répertoire parent. Sinon, si le fichier est modifié à cause de l'attribut O_TRUNC, ses champs st_ctime et st_mtime sont remplis avec l'heure actuelle.
O_DIRECT | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'attribut O_DIRECT peut imposer des restrictions d'alignement sur la longueur et l'adresse des tampons en espace utilisateur et sur la tête de lecture des E/S. Pour l'alignement Linux, les restrictions varient suivant le système de fichiers et la version du noyau et peuvent être complètement absentes. Toutefois, il n'y a actuellement aucune interface, indépendante du système de fichiers, permettant à une application de connaitre ces restrictions pour un fichier ou système de fichiers donné. Certains systèmes de fichiers fournissent leur propore interface pour le faire, comme par exemple l'opération XFS_IOC_DIOINFO de xfsctl(3).
Sous linux 2.4, les tailles des transferts, l'alignement d'un tampon utilisateur et la position dans le fichier doivent être des multiples de la taille de bloc logique du système de fichiers. Sous Linux 2.6, un alignement sur des frontières 512 octets suffit.
L'attribut O_DIRECT a été introduit par SGI IRIX, qui a des restrictions d'alignement identiques à celles de 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 prise en charge de O_DIRECT a été ajoutée dans Linux 2.4.10. Les noyaux plus anciens ignorent simplement cet attribut. Certains systèmes de fichiers peuvent ne pas implémenter l'attribut et open() échouera avec l'erreur EINVAL s'il est utilisé.
Les applications devraient éviter le mélange de l'utilisation de O_DIRECT et des E/S normales sur le même fichier, particulièrement pour le chevauchement de régions d'octet dans le même fichier. Même si le système de fichiers gère correctement les problèmes de cohésion dans cette situation, le trafic d'E/S sera probablement plus lent que si l'un des modes seulement est utilisé. De la même manière, les applications devraient éviter le mélange de l'utilisation de mmap(2) avec des E/S directes sur le même fichier.
Le comportement de O_DIRECT avec NFS diffère des systèmes de fichiers locaux. Les anciens noyaux, ou les noyaux configurés de certaines manières, peuvent ne pas prendre en charge cette combinaison. Le protocole NFS ne prend pas en charge le passage de l'attribut vers le serveur, aussi les E/S O_DIRECT court-circuiteront le cache de pages sur le client ; le serveur peut conserver en cache les E/S. Le client demande au serveur de réaliser des E/S synchrones afin de préserver la sémantique synchrone de O_DIRECT. Certains serveurs seront peu performants dans ces circonstances, particulièrement si la taille des E/S est petite. Certains serveurs peuvent également être configurés pour mentir au client à propos de l'arrivée d'E/S à un stockage stable ; ceci permet d'éviter de réduire la performance mais fait courrir des risques en cas de coupure de l'alimentation du serveur. Le client NFS Linux ne place aucune restriction d'alignement sur les E/S O_DIRECT.
En résumé, O_DIRECT est un outil potentiellement puissant qui devrait être utilisé avec précaution. Il est recommandé que les applications considèrent l'utilisation de O_DIRECT comme une option de performance qui est déactivée par défaut.
BOGUES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 15 octobre 1996 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 open ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
EACCES | ERREURS |
EEXIST | ERREURS |
EFAULT | ERREURS |
EFBIG | ERREURS |
EISDIR | ERREURS |
ELOOP | ERREURS |
EMFILE | ERREURS |
ENAMETOOLONG | ERREURS |
ENFILE | ERREURS |
ENODEV | ERREURS |
ENOENT | ERREURS |
ENOMEM | ERREURS |
ENOSPC | ERREURS |
ENOTDIR | ERREURS |
ENXIO | ERREURS |
EPERM | ERREURS |
EROFS | ERREURS |
ETXTBSY | ERREURS |
EWOULDBLOCK | ERREURS |
O_APPEND | DESCRIPTION |
O_ASYNC | DESCRIPTION |
O_CLOEXEC (Depuis Linux 2.6.23) | DESCRIPTION |
O_CREAT | DESCRIPTION |
O_DIRECT (Depuis Linux 2.4.10) | DESCRIPTION |
O_DIRECTORY | DESCRIPTION |
O_EXCL | DESCRIPTION |
O_LARGEFILE | DESCRIPTION |
O_NOATIME(DepuisLinux 2.6.8) | DESCRIPTION |
O_NOCTTY | DESCRIPTION |
O_NOFOLLOW | DESCRIPTION |
O_NONBLOCK ou O_NDELAY | DESCRIPTION |
O_SYNC() | DESCRIPTION |
O_TRUNC | DESCRIPTION |
S_IRGRP | DESCRIPTION |
S_IROTH | DESCRIPTION |
S_IRUSR | DESCRIPTION |
S_IRWXG | DESCRIPTION |
S_IRWXO | DESCRIPTION |
S_IRWXU | DESCRIPTION |
S_IWGRP | DESCRIPTION |
S_IWOTH | DESCRIPTION |
S_IWUSR | DESCRIPTION |
S_IXGRP | DESCRIPTION |
S_IXOTH | DESCRIPTION |
S_IXUSR | DESCRIPTION |