OPEN(2)

NOM
open, creat - Ouvrir ou créer éventuellement un fichier ou un périphérique

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
Étant donné le chemin pathname d'un fichier, open() renvoie un descripteur de fichier, un petit entier positif ou nul utilisable par des appels système ultérieurs (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 encore ouvert pour le processus.

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 du système. Cette entrée enregistre la position dans le 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 à 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 ouvert n'est initialement pas partagée avec un autre processus, mais ce partage peut survenir après un 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 :

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
    Activer le pilotage d'entrées-sorties par signal : 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, pseudo-terminaux, sockets et (depuis Linux 2.6) tubes et FIFO. Voir 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 une opération supplémentaire 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.). Voir par exemple les options de montage bsdgroups et sysvgroups décrites dans la page mount(8)).

    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 fichier 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 :

    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. Ceci dégradera en général les performances, mais est utilisé dans des situations spéciales, lorsque les applications ont leur propres caches. Les entrées-sorties dans le fichier se font directement depuis l'espace utilisateur, elles sont synchrones (à la fin de read(2) ou write(2), les données ont obligatoirement été transférées). Voir NOTES plus loin pour une discussion approfondie.

    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).

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. Le comportement de O_EXCL est indéterminé si O_CREAT n'est pas spécifié. Lorsque ces deux attributs sont spécifiés, les liens symboliques ne sont pas 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. Si link(2) renvoie 0, le verrouillage est réussi. Sinon, utilisez stat(2) sur ce fichier unique pour vérifier si le nombre de liens a augmenté jusqu'à 2, auquel cas le verrouillage est également réussi.

O_LARGEFILE
    (LFS) (Ndt : Large Files System) Autoriser l'ouverture des fichiers dont la taille ne peut pas être représentée avec un off_t (mais qui peut l'être avec un off64_t). La macro _LARGEFILE64_SOURCE doit être définie afin d'obtenir cette définition. Donner la valeur 64 à la macro de test de fonctionnalité (plutôt que d'utiliser O_LARGEFILE) _FILE_OFFSET_BITS est la méthode préférée pour accéder à de gros fichiers sur les systèmes 32 bits (voir feature_test_macros(7)).

O_NOATIME (Depuis Linux 2.6.8)
    Ne pas mettre à jour l'horodatage du dernier accès au fichier (st_atime dans l'in