OPEN(2)

NOM
open, creat - Ouvrir ou creer eventuellement un fichier.

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
open essaye d'ouvrir un fichier et retourne un descripteur de fichier (petit entier non negatif a utiliser avec read, write, etc...) 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. flags peut aussi etre un OU binaire ( | ) avec un ou plusieurs des elements suivants :

O_CREAT
    Creer le fichier s'il n'existe pas.

O_EXCL
    En conjonction avec O_CREAT, declenchera une erreur si le fichier existe, et open echouera. O_EXCL ne fonctionne pas sur les systemes de fichiers NFS. Les programmes qui ont besoin de cette fonctionnalite pour verrouiller des taches risquent de rencontrer une "race condition". La solution consiste a creer un fichier unique sur le meme systeme de fichiers (par exemple avec le pid et le nom de l'hote), utiliser link(2) pour creer un lien sur un fichier de verrouillage et d'utiliser stat(2) sur ce fichier unique pour verifier si le nombre de liens a augmente jusqu'a 2. Ne pas utiliser la valeur de retour de link().

O_NOCTTY
    Si pathname correspond a un peripherique de terminal — voir tty(4) —, il ne deviendra pas le terminal controlant le processus meme si celui-ci n'est attache a aucun autre terminal.

O_TRUNC
    Si le fichier existe il sera tronque.

O_APPEND
    Le fichier est ouvert en mode "ajout". Initialement, et avant chaque write, la tete de lecture/ecriture est placee a la fin du fichier comme avec lseek. 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 a fait que NFS ne supporte pas l'operation d'ajout de donnees dans un fichier, aussi le noyau client est oblige de la simuler, avec un risque de concurrence des taches.

O_NONBLOCK or 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.

O_SYNC
    Le fichier est ouvert en ecriture synchronisee. Chaque appel a write sur le fichier bloquera le processus appelant jusqu'a ce que les donnees aient ete ecrites physiquement sur le support materiel (voir la section RESTRICTIONS plus bas).

Certains de ces attributs optionnels peuvent etre modifies par la suite avec la fonction fcntl. mode indique les permissions a utiliser si un nouveau fichier est cree. Cette valeur est modifiee par le umask du processus : la veritable valeur utilisee est (mode & ~umask). mode devrait toujours etre indique quand O_CREAT est dans les attributs flags, (il est ignore dans les autres cas). creat est equivalent a open avec l'attribut flags egal a O_CREAT | O_WRONLY | O_TRUNC.

VALEUR RENVOYEE
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. 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, c'est le client qui 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.

ERREURS

EEXIST
    pathname existe deja et O_CREAT et O_EXCL ont ete indiques.

EISDIR
    On a demande une ecriture alors que pathname correspond a un repertoire.

ETXTBSY
    On a demande une ecriture alors que pathname correspond a un fichier executable actuellement utilise.

EFAULT
    pathname pointe en dehors de l'espace d'adressage accessible

EACCES
    L'acces demande au fichier est interdit, ou l'un des repertoires du chemin pathname ne permet pas de consultation.

ENAMETOOLONG
    pathname est trop long.

ENOENT
    Un repertoire du chemin d'acces pathname n'existe pas ou est un lien symbolique pointant nulle part.

ENOTDIR
    Un element du chemin d'acces pathname n'est pas un repertoire.

EMFILE
    Le processus a deja ouvert le nombre maximal de fichiers.

ENFILE
    La limite du nombre total de fichiers ouverts sur le systeme est atteinte.

ENOMEM
    Pas assez de memoire pour le noyau

EROFS
    Un acces en ecriture est demande alors que pathname reside sur un systeme de fichiers en lecture seule.

ELOOP
    pathname contient une reference circulaire (a travers un lien symbolique)

ENOSPC
    pathname devrait etre cree mais le peripherique concerne n'a plus assez de place pour un nouveau fichier.

CONFORMITE
SVr4, SVID, POSIX, X/OPEN, BSD 4.3

RESTRICTIONS
Plusieurs problemes se posent avec le protocole NFS, concernant entre autres O_SYNC, et O_NDELAY .

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