Man page - creat(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

open

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
creat()
openat()
openat2(2)
VALEUR RENVOYÉE
ERREURS
VERSIONS
E/S synchrones
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
NOTES
Description de fichier ouvert
NFS
FIFO
Mode d’accùs au fichier
Justification des appels openat() et des API des descripteurs de fichier derépertoires
O_DIRECT
BOGUES
VOIR AUSSI
TRADUCTION

NOM

open, openat, creat - Ouvrir ou créer éventuellement un fichier

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <fcntl.h>

int open(const char * pathname , int flags , ...
/* mode_t mode */ );

int creat(const char * pathname , mode_t mode );

int openat(int dirfd , const char * pathname , int flags , ...
/* mode_t mode */ );

/* Documenté à part, dans openat2 (2) :
*/
int openat2(int
dirfd , const char * pathname ,
const struct open_how *
how , size_t size );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

openat () :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
avant la glibc 2.10 :
_ATFILE_SOURCE

DESCRIPTION

L’appel systĂšme open () ouvre le fichier indiquĂ© par pathname . S’il n’existe pas, il peut (si O_CREAT est indiquĂ© dans flags ) ĂȘtre créé par open ().

La valeur renvoyĂ©e par open () est un descripteur de fichier, un petit entier positif ou nul qui est un indice d’entrĂ©e dans la table de processus de descripteurs de fichiers ouverts. Le descripteur de fichier est ensuite utilisĂ© dans d’autres appels systĂšme ( read (2), write (2), lseek (2), fcntl (2), etc.) pour se rĂ©fĂ©rer au fichier ouvert. Le descripteur de fichier renvoyĂ© par un appel rĂ©ussi sera celui du plus petit numĂ©ro de 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 description de fichier ouvert enregistre la position dans le fichier et les attributs d’état du fichier (voir ci-dessous). Un descripteur de fichier est une rĂ©fĂ©rence Ă  une description de fichier ouvert ; cette rĂ©fĂ©rence n’est pas modifiĂ©e si pathname est ensuite supprimĂ© ou modifiĂ© pour faire rĂ©fĂ©rence Ă  un autre fichier. Pour obtenir plus de dĂ©tails sur les descriptions de fichiers ouverts, consultez NOTES.

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.

De plus, zĂ©ro ou plusieurs attributs de crĂ©ation de fichier et attributs d’état de fichier peuvent ĂȘtre indiquĂ©s dans flags avec un OU binaire. Les attributs de crĂ©ation de fichier sont O_CLOEXEC , O_CREAT , O_DIRECTORY , O_EXCL , O_NOCTTY , O_NOFOLLOW , O_TMPFILE et O_TRUNC . Les attributs d’état de fichier sont tous les autres attributs indiquĂ©s ci-dessous. La distinction entre ces deux groupes est que les attributs d’état de fichier modifient la sĂ©mantique de l’opĂ©ration d’ouverture elle-mĂȘme, tandis que les attributs de l’état du fichier modifient celle des opĂ©rations d’E/S qui suivent. Les attributs d’état de fichier peuvent ĂȘtre lus et (dans certains cas) modifiĂ©s ; consultez fcntl (2) pour plus de prĂ©cisions.

La liste complĂšte des attributs de crĂ©ation et d’état de fichier est la suivante.
O_APPEND

Le fichier est ouvert en mode « ajout ». Avant chaque write (2), la tĂȘte de lecture/Ă©criture est placĂ©e Ă  la fin du fichier comme avec lseek (2). La modification de la position dans le fichier et l’opĂ©ration d’écriture sont effectuĂ©es sous forme d’étape atomique unique.

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 gĂšre pas l’opĂ©ration d’ajout de donnĂ©es dans un fichier, aussi le noyau du client est obligĂ© de la simuler, ce qui est impossible sans 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. Consultez aussi BOGUES ci-dessous.

O_CLOEXEC (depuis Linux 2.6.23)

Activer l’attribut « close-on-exec » pour le nouveau descripteur de fichier. En prĂ©cisant cet attribut, on Ă©vite au programme d’avoir Ă  utiliser les opĂ©rations F_SETFD de fcntl (2) pour positionner l’attribut FD_CLOEXEC .

Notez que le recours Ă  cet attribut est indispensable pour certains programmes multithreadĂ©s. En effet, l’utilisation d’une opĂ©ration F_SETFD de fcntl (2) pour positionner l’attribut FD_CLOEXEC ne suffit pas Ă  Ă©viter une situation d’accĂšs concurrents si un thread ouvre un descripteur de fichier et tente d’activer l’attribut « close-on-exec » au moyen de fcntl (2) au moment oĂč un autre thread exĂ©cute fork (2) suivi de execve (2). Selon l’ordre dans lequel ces opĂ©rations s’exĂ©cutent, cette concurrence peut aboutir Ă  ce que le descripteur de fichier renvoyĂ© par open () soit involontairement mis Ă  disposition du programme exĂ©cutĂ© par le processus enfant créé par fork (2). (Ce type de concurrence est en principe possible pour tout appel systĂšme qui crĂ©e un descripteur de fichier dont l’attribut « close-on-exec » est actif ; certains appels systĂšme de Linux offrent des Ă©quivalents de l’attribut O_CLOEXEC pour rĂ©gler ce problĂšme.)

O_CREAT

Si pathname n’existe pas, le crĂ©er en tant que fichier normal.

Le propriĂ©taire (identifiant utilisateur) du nouveau fichier est positionnĂ© sur l’identifiant de l’utilisateur effectif du processus.

Le groupe (identifiant de groupe) propriĂ©taire du nouveau fichier est soit positionnĂ© sur l’identifiant du groupe effectif du processus (dans la sĂ©mantique de System V), soit sur celui du rĂ©pertoire parent (dans la sĂ©mantique de BSD). Sur Linux, le comportement varie selon que le positionnement du bit set-group-ID sur le rĂ©pertoire parent : s’il est positionnĂ©, la sĂ©mantique de BSD s’applique, sinon c’est celle de System V. Pour certains de fichiers, le comportement dĂ©pend aussi des options de montage bsdgroups et sysvgroups dĂ©crites dans mount (8).

L’argument mode indique les bits du mode du fichier Ă  appliquer lors de la crĂ©ation d’un nouveau fichier. Si ni O_CREAT , ni O_TMPFILE ne sont indiquĂ©s dans flags , mode est ignorĂ© (et peut ainsi ĂȘtre indiquĂ© en tant que 0 voire absent). L’argument mode doit ĂȘtre fourni si O_CREAT ou O_TMPFILE est indiquĂ© dans flags ; s’il n’est pas indiquĂ©, des octets arbitraires de la pile s’appliqueront comme mode du fichier.

Le mode effectif est modifiĂ© par le umask du processus de maniĂšre classique : en l’absence d’ACL (liste de contrĂŽle d’accĂšs) par dĂ©faut, les droits du fichier créé sont (mode & ~umask) .

Notez que 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.

Selon POSIX, le positionnement des autres bits dans mode n’a pas d’effet spĂ©cifiĂ©. Sur Linux, les bits suivants sont Ă©galement gĂ©rĂ©s dans mode :

S_ISUID

0004000 bit set-user-ID.

S_ISGID

0002000 bit set-group-ID (voir inode (7)).

S_ISVTX

0001000 bit sticky (voir inode (7)).

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 utile dans des situations spĂ©ciales, comme lorsque les applications ont leur propre cache. Les entrĂ©es-sorties de fichier sont faites directement de et vers les tampons d’espace utilisateur. L’ajout de l’attribut O_DIRECT fait que les entrĂ©es-sorties sont synchrones ; en rĂ©alitĂ© un effort est fait pour rendre le transfert synchrone mais cela n’offre pas la garantie fournie par l’attribut O_SYNC que les donnĂ©es et mĂ©tadonnĂ©es sont transfĂ©rĂ©es. Pour garantir des entrĂ©es-sorties synchrones, l’attribut O_SYNC doit ĂȘtre utilisĂ© en plus de l’attribut O_DIRECT . Consultez la section NOTES ci-dessous.

Une interface à la sémantique similaire (mais dépréciée) pour les périphériques blocs est décrite dans raw (8).

O_DIRECTORY

Si pathname n’est pas un rĂ©pertoire, l’ouverture Ă©choue. Cet attribut fut ajoutĂ© dans Linux 2.1.126, pour Ă©viter des problĂšmes de dysfonctionnement si opendir (3) est invoquĂ© sur une FIFO ou un pĂ©riphĂ©rique Ă  bande.

O_DSYNC

Les opĂ©rations d’écriture dans le fichier se dĂ©rouleront selon les conditions d’exĂ©cution des opĂ©rations E/S synchrones avec garantie d’intĂ©gritĂ© des donnĂ©es .

Au moment oĂč write (2) (ou un appel similaire) renvoie une donnĂ©e, elle a Ă©tĂ© transmise au matĂ©riel sur lequel s’exĂ©cute l’appel, avec toutes les mĂ©tadonnĂ©es du fichier qui pourraient ĂȘtre nĂ©cessaires Ă  la rĂ©cupĂ©ration de cette donnĂ©e (c’est Ă  dire comme si chaque appel Ă  write (2) Ă©tait suivi d’un appel Ă  fdatasync (2)). Consultez NOTES ci-dessous .

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 avec l’erreur EEXIST .

Lorsque ces deux attributs sont spĂ©cifiĂ©s, les liens symboliques ne sont pas suivis : si pathname est un lien symbolique, open () Ă©chouera quel que soit l’endroit oĂč pointe le lien symbolique.

En gĂ©nĂ©ral, le comportement de O_EXCL est indĂ©terminĂ© s’il est utilisĂ© sans O_CREAT . Il existe une exception toutefois : Ă  partir de Linux 2.6, O_EXCL peut ĂȘtre utilisĂ© sans O_CREAT si pathname fait rĂ©fĂ©rence Ă  un pĂ©riphĂ©rique bloc. Si le pĂ©riphĂ©rique bloc est utilisĂ© par le systĂšme (par exemple, s’il est montĂ©), open () Ă©choue avec l’erreur EBUSY .

Sur les systĂšmes de fichiers NFS, O_EXCL n’est pris en charge qu’avec la version NFSv3 ou ultĂ©rieure, sur les noyaux 2.6 ou plus rĂ©cents. Dans les environnements NFS oĂč la prise en charge d’ O_EXCL 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 atomique de fichier 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, utiliser 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) Permettre 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 la date de dernier accùs au fichier (( st_atime dans l’inƓud) quand le fichier est read (2).

Cet attribut ne peut ĂȘtre utilisĂ© que si l’une des conditions suivantes est vraie :

-

L’identifiant utilisateur effectif du fichier correspond Ă  celui du propriĂ©taire du fichier.

-

Le processus appelant a la capacitĂ© CAP_FOWNER dans son espace de noms utilisateur et l’identifiant utilisateur du propriĂ©taire du fichier a une projection dans l’espace de noms.

Cet 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 le composant final (c’est-Ă -dire, celui obtenu par basename) de pathname est un lien symbolique, l’ouverture Ă©choue avec l’erreur ELOOP . Les liens symboliques dans les composants apparus plus tĂŽt dans le chemin seront encore suivis (remarquez que l’erreur ELOOP qui peut intervenir dans ce cas ne peut pas ĂȘtre distinguĂ©e de l’échec d’une ouverture Ă  cause d’un trop grand nombre de liens symboliques lors de la rĂ©solution de composants dans le prĂ©fixe du chemin).

Cet attribut est une extension FreeBSD qui a été ajoutée dans Linux 2.1.126, puis normalisée dans POSIX.1-2008.

Voir aussi O_PATH ci-dessous.

O_NONBLOCK ou O_NDELAY

Si possible, le fichier est ouvert en mode « non-bloquant ». Ni la fonction open () ni aucune autre opĂ©ration d’E/S ultĂ©rieure sur le descripteur de fichier renvoyĂ© ne laissera le processus appelant en attente.

Remarquez que positionner cet attribut n’a pas d’effet sur une opĂ©ration poll (2), select (2), epoll (7) et Ă©quivalentes, puisque ces interfaces informent simplement l’appelant si un descripteur de fichier est « ready », Ă  savoir qu’une opĂ©ration E/S effectuĂ©e sur le descripteur de fichier avec l’attribut O_NONBLOCK clear ne se bloquerait pas.

Remarquez que cet attribut n’a aucun effet sur les fichiers ordinaires et les pĂ©riphĂ©riques de bloc ; c’est-Ă -dire que les opĂ©rations d’E/S se bloqueront (briĂšvement) lorsqu’une activitĂ© du pĂ©riphĂ©rique est nĂ©cessaire, indĂ©pendamment du positionnement de O_NONBLOCK . Comme la sĂ©mantique de O_NONBLOCK pourrait Ă©ventuellement ĂȘtre implĂ©mentĂ©e, les applications ne doivent pas dĂ©pendre d’un blocage comportemental quand elles indiquent cet attribut pour des fichiers ordinaires et des pĂ©riphĂ©riques de bloc.

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_PATH (depuis Linux 2.6.39)

Obtenir un descripteur de fichier qui peut ĂȘtre utile de deux façons : pour indiquer la localisation dans l’arborescence du systĂšme de fichiers et pour effectuer des opĂ©rations exclusivement au niveau du descripteur de fichier. Le fichier n’est pas lui-mĂȘme ouvert et d’autres opĂ©rations sur le fichier (par exemple read (2), write (2), fchmod (2), fchown (2), fgetxattr (2), ioctl (2), mmap (2)) Ă©choueront en renvoyant l’erreur EBADF .

Les opĂ©rations suivantes peuvent ĂȘtre rĂ©alisĂ©es sur le descripteur de fichier obtenu :

-

close (2).

-

fchdir (2), si le descripteur de fichier renvoie à un répertoire (depuis Linux 3.5).

-

fstat (2) (depuis Linux 3.6)

-

fstatfs (2) (depuis Linux 3.12)

-

Dupliquer le descripteur de fichier ( dup (2), fcntl (2), F_DUPFD , etc.).

-

Consulter et affecter les valeurs des attributs du descripteur de fichier ( fcntl (2), F_GETFD et F_SETFD ).

-

RĂ©cupĂ©rer les attributs d’état de fichiers ouverts au moyen de l’opĂ©ration fcntl (2) F_GETFL : les attributs renvoyĂ©s comprendront le bit O_PATH .

-

Transmettre le descripteur de fichier comme l’argument dirfd de openat (2) et les autres appels systĂšme « *at() ». Cela comprend linkat (2) avec AT_EMPTY_PATH (ou via procfs au moyen de AT_SYMLINK_FOLLOW ) mĂȘme si le fichier n’est pas un rĂ©pertoire.

-

Transmettre le descripteur de fichier à un autre processus à l’aide d’un socket de domaine UNIX (consultez SCM_RIGHTS dans unix (7)).

Lorsque O_PATH est prĂ©cisĂ© dans flags , seuls les bits O_CLOEXEC , O_DIRECTORY et O_NOFOLLOW de l’attribut sont pris en compte.

L’ouverture d’un fichier ou d’un rĂ©pertoire avec l’attribut O_PATH ne nĂ©cessite pas de droits sur l’objet lui-mĂȘme (mais elle exige le droit d’exĂ©cution sur les rĂ©pertoires du prĂ©fixe de chemin). En fonction des opĂ©rations ultĂ©rieures, la vĂ©rification des droits du fichier adĂ©quats peut se faire (par exemple fchdir (2) exige le droit d’exĂ©cution sur le rĂ©pertoire auquel renvoie son argument de descripteur de fichier). Inversement, l’obtention de la rĂ©fĂ©rence Ă  un objet de systĂšme de fichiers en l’ouvrant par l’attribut O_RDONLY exige que l’appelant ait le droit de lire l’objet mĂȘme quand l’opĂ©ration ultĂ©rieure (par exemple, fchdir (2), fstat (2)) n’a pas besoin des droits de lecture sur l’objet.

Si pathname est un lien symbolique et si l’attribut O_NOFOLLOW est prĂ©cisĂ©, alors l’appel renvoie le descripteur de fichier d’un lien symbolique. Ce descripteur de fichier peut ĂȘtre utilisĂ© comme l’argument dirfd lors d’appels aux fonctions fchownat (2), fstatat (2), linkat (2) et readlinkat (2) avec un chemin d’accĂšs vide pour permettre Ă  l’appel de s’exĂ©cuter sur le lien symbolique.

Si pathname renvoie Ă  un point de montage automatique non encore effectuĂ©, donc aucun autre systĂšme de fichiers n’y est montĂ©, alors l’appel renvoie un descripteur de fichier qui se rapporte au rĂ©pertoire de montage automatique sans effectuer de montage. fstatfs (2) peut alors ĂȘtre utilisĂ© pour dĂ©terminer s’il s’agit bien d’un point de montage automatique non non effectuĂ© ( .f_type == AUTOFS_SUPER_MAGIC ).

Une utilisation de O_PATH sur des fichiers ordinaires consiste Ă  fournir l’équivalent de la fonctionnalitĂ© O_EXEC de POSIX.1. Cela nous permet d’ouvrir un fichier sur lequel on a le droit d’exĂ©cution mais pas de lecture, puis d’exĂ©cuter ce fichier selon des Ă©tapes comme suit :

char buf[PATH_MAX];
fd = open("un_programme", O_PATH);
snprintf(buf, PATH_MAX, "/proc/self/fd/%d", fd);
execl(buf, "un_programme", (char *) NULL);

Un descripteur de fichier O_PATH peut Ă©galement ĂȘtre fourni comme argument de fexecve (3).

O_SYNC

Les opĂ©rations d’écriture dans le fichier se dĂ©rouleront selon les conditions d’exĂ©cution des opĂ©rations E/S synchrones avec garantie d’intĂ©gritĂ© du fichier (contrairement Ă  l’exĂ©cution des opĂ©rations E/S synchrones avec garantie d’intĂ©gritĂ© des donnĂ©es fournie par O_DSYNC .)

Au moment oĂč write (2) (ou un appel similaire) renvoie une donnĂ©e, cette donnĂ©e et les mĂ©tadonnĂ©es associĂ©es au fichier ont Ă©tĂ© transmises au matĂ©riel sur lequel s’exĂ©cute l’appel (autrement dit, comme si chaque appel Ă  write (2) Ă©tait suivi d’un appel Ă  fsync (2)). Consultez NOTES ci-dessous .

O_TMPFILE (depuis Linux 3.11)

CrĂ©er un fichier temporaire sans nom. L’argument pathname indique un rĂ©pertoire ; un inƓud sans nom sera créé dans le systĂšme de fichiers de ce rĂ©pertoire. Tout ce qui est Ă©crit dans le fichier rĂ©sultant sera perdu quand le dernier descripteur de fichier sera fermĂ©, Ă  moins de donner un nom au fichier.

O_TMPFILE doit ĂȘtre indiquĂ© avec soit O_RDWR , soit O_WRONLY , et facultativement O_EXCL . Si O_EXCL n’est pas indiquĂ©, alors linkat (2) peut ĂȘtre utilisĂ© pour lier le fichier temporaire dans le systĂšme de fichiers, le rendant permanent, en utilisant du code comme :

char path[PATH_MAX];
fd = open("/path/to/dir", O_TMPFILE | O_RDWR,
S_IRUSR | S_IWUSR);
/* E/S du fichier sur 'fd'... */
linkat(fd, "", AT_FDCWD, "/path/for/file", AT_EMPTY_PATH);
/* Si l’appelant n’a pas la capacitĂ© CAP_DAC_READ_SEARCH (nĂ©cessaire
pour utiliser AT_EMPTY_PATH avec linkat(2)) et s’il existe un
systĂšme de fichiers proc(5) montĂ©, l’appel linkat(2) ci-dessus peut
ĂȘtre remplacĂ© par :
snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd);
linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file",
AT_SYMLINK_FOLLOW);
*/

Dans ce cas, l’argument mode d’ open () dĂ©termine le mode de droits du fichier, comme avec O_CREAT .

Indiquer O_EXCL en conjonction avec O_TMPFILE empĂȘche de lier un fichier temporaire dans le systĂšme de fichiers comme prĂ©cĂ©demment (remarquez que la signification de O_EXCL dans ce cas est diffĂ©rente de la signification habituelle de O_EXCL ).

Les deux principaux cas d’utilisation de O_TMPFILE sont prĂ©sentĂ©s ci-dessous :

-

AmĂ©liorer la fonctionnalitĂ© tmpfile (3) : crĂ©ation de fichiers temporaires sans situation de compĂ©tition qui (1) sont automatiquement supprimĂ©s Ă  la fermeture ; (2) ne peuvent jamais ĂȘtre atteints par n’importe quel chemin ; (3) ne sont pas exposĂ©s aux attaques de lien symbolique ; et (4) ne nĂ©cessitent pas Ă  l’appelant d’inventer des noms uniques.

-

CrĂ©er un fichier initialement invisible, qui est ensuite peuplĂ© de donnĂ©es et ajustĂ© aux attributs de systĂšme de fichiers adĂ©quats ( fchown (2), fchmod (2), fsetxattr (2), etc.) avant d’ĂȘtre liĂ© de façon atomique dans le systĂšme de fichiers dans un Ă©tat complĂštement formĂ© (en utilisant linkat (2) comme dĂ©crit prĂ©cĂ©demment).

O_TMPFILE nĂ©cessite une prise en charge par le systĂšme de fichiers sous-jacent. Seule une partie des systĂšmes de fichiers Linux fournit cette prise en charge. Dans l’implĂ©mentation initiale, la prise en charge Ă©tait assurĂ©e pour les systĂšmes de fichiers ext2, ext3, ext4, UDF, Minix et tmpfs. La prise en charge d’autres systĂšmes de fichiers a ensuite Ă©tĂ© ajoutĂ©e ainsi : XFS (Linux 3.15) ; Btrfs (Linux 3.16) ; F2FS (Linux 3.16) ; et ubifs (Linux 4.9)

O_TRUNC

Si le fichier existe, est un fichier ordinaire et que le mode d’accĂšs permet l’é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Ă©.

creat()

L’appel creat () est Ă©quivalent Ă  open () avec l’attribut flags Ă©gal Ă  O_CREAT|O_WRONLY|O_TRUNC .

openat()

L’appel systĂšme openat () fonctionne de la mĂȘme façon que open (), les diffĂ©rences Ă©tant dĂ©crites ici.

L’argument dirfd est utilisĂ© avec l’argument pathname comme suit :

-

Si le chemin donné dans pathname est absolu, dirfd est ignoré.

-

Si le chemin fourni dans pathname est un chemin relatif et si dirfd a la valeur spéciale AT_FDCWD , alors pathname est interprété par rapport au répertoire courant du processus appelant, comme dans open ().

-

Si pathname est un chemin relatif, il est interprĂ©tĂ© par rapport au rĂ©pertoire rĂ©fĂ©rencĂ© par le descripteur de fichier dirfd (plutĂŽt que par rapport au rĂ©pertoire courant du processus appelant, comme cela est fait par open () pour un chemin relatif). Dans ce cas, dirfd doit ĂȘtre un rĂ©pertoire qui a Ă©tĂ© ouvert en lecture ( O_RDONLY ) ou en utilisant l’attribut O_PATH .

Si le chemin fourni dans pathname est un chemin relatif et si dirfd n’est pas un descripteur de fichier valable, il en rĂ©sulte une erreur ( EBADF ). (SpĂ©cifier un numĂ©ro de descripteur de fichier non valable dans dirfd peut ĂȘtre utilisĂ© comme moyen de s’assurer que pathname est absolu.)

openat2(2)

L’appel systĂšme openat2 (2) est une extension de openat () et il fournit un ensemble supplĂ©mentaire aux fonctionnalitĂ©s de openat (). Il est documentĂ© Ă  part dans openat2 (2).

VALEUR RENVOYÉE

open (), openat () et creat () renvoient le nouveau descripteur de fichier (un entier non nĂ©gatif) s’ils rĂ©ussissent. En cas d’erreur, ou -1 est renvoyĂ© et errno est dĂ©fini pour indiquer l’erreur.

ERREURS

open (), openat () et creat () peuvent échouer avec les erreurs suivantes :

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

EACCES

Lorsque O_CREAT est indiquĂ©, le systcl protected_fifos ou protected_regular est activĂ©, le fichier existe dĂ©jĂ  ou est une FIFO ou un fichier ordinaire, le propriĂ©taire du fichier n’est ni l’utilisateur actuel, ni celui du rĂ©pertoire qui le contient, et ce rĂ©pertoire est accessible en Ă©criture et en exĂ©cution pour tout le monde. Pour plus de dĂ©tails, consultez les descriptions de /proc/sys/fs/protected_fifos et de /proc/sys/fs/protected_regular dans proc_sys_fs (5).

EBADF

( openat ()) pathname est relatif mais dirfd n’est ni AT_FDCWD ni un descripteur de fichier valable.

EBUSY

O_EXCL était indiqué dans flags et pathname se rapporte à un périphérique bloc utilisé par le systÚme (par exemple, il est monté).

EDQUOT

Si O_CREAT est indiquĂ©, le fichier n’existe pas et le quota de blocs de disque ou d’inƓuds de l’utilisateur sur le systĂšme de fichiers a Ă©tĂ© atteint.

EEXIST

pathname existe déjà et O_CREAT et O_EXCL ont été indiqués.

EFAULT

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

EINVAL

Le systùme de fichiers ne gùre pas l’attribut O_DIRECT . Consultez NOTES pour de plus amples renseignements.

EINVAL

Valeur incorrecte dans flags .

EINVAL

O_TMPFILE a Ă©tĂ© indiquĂ© dans flags , mais ni O_WRONLY ni O_RDWR n’ont Ă©tĂ© indiquĂ©s.

EINVAL

O_CREAT Ă©tait indiquĂ© dans flags et le composant final (« basename ») du pathname du nouveau fichier n’est pas valable (il contient par exemple des caractĂšres non autorisĂ©s par le systĂšme de fichiers sous-jacent).

EINVAL

Le composant final (« basename ») de pathname n’est pas valable (il contient, par exemple, des caractĂšres non autorisĂ©s par le systĂšme de fichiers sous-jacent).

EISDIR

Une écriture a été demandée alors que pathname correspond à un répertoire (en fait, O_WRONLY ou O_RDWR ont été déclarés).

EISDIR

pathname fait référence à un répertoire existant, O_TMPFILE et soit O_WRONLY , soit O_RDWR , ont été indiqués dans flags , mais cette version du noyau ne fournit pas la fonctionnalité O_TMPFILE .

ELOOP

Trop de liens symboliques ont été rencontrés en parcourant nom_chemin .

ELOOP

pathname était un lien symbolique, et flags indiquait O_NOFOLLOW mais pas O_PATH .

EMFILE

La limite par processus du nombre de descripteurs de fichiers ouverts a été atteinte (voir la description de RLIMIT_NOFILE dans getrlimit (2)).

ENAMETOOLONG

nom_chemin est trop long.

ENFILE

La limite du nombre total de fichiers ouverts pour le systÚme entier 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 n’est pas positionnĂ© et le fichier nommĂ© n’existe pas.

ENOENT

Un des rĂ©pertoires du chemin d’accĂšs nom_chemin n’existe pas ou est un lien symbolique pointant nulle part.

ENOENT

pathname fait référence à un répertoire inexistant, O_TMPFILE et soit O_WRONLY , soit O_RDWR , ont été indiqués dans flags , mais cette version du noyau ne fournit pas la fonctionnalité O_TMPFILE .

ENOMEM

Le fichier nommĂ© est une FIFO, mais la mĂ©moire du tampon de la FIFO ne peut pas ĂȘtre allouĂ©e car la limite dure par processus d’allocation de mĂ©moire pour des tubes (pipes) a Ă©tĂ© atteinte et l’appelant n’est pas privilĂ©gié ; voir pipe (7).

ENOMEM

La mĂ©moire disponible du noyau n’était pas suffisante.

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 utilisĂ© comme rĂ©pertoire dans pathname ne l’est pas, ou l’attribut O_DIRECTORY est utilisĂ© et pathname n’est pas un rĂ©pertoire.

ENOTDIR

( openat ()) pathname est un chemin relatif et le descripteur de fichier dirfd est associé à un fichier, pas à un répertoire.

ENXIO

O_NONBLOCK | O_WRONLY est positionnĂ©, le fichier nommĂ© est une FIFO et le processus n’a pas cette FIFO ouverte en lecture.

ENXIO

Le fichier est un fichier spĂ©cial de pĂ©riphĂ©rique et il n’existe aucun pĂ©riphĂ©rique correspondant.

ENXIO

Le fichier est un socket de domaine UNIX.

EOPNOTSUPP

Le systĂšme de fichiers contenant pathname ne prend pas en charge O_TMPFILE .

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 octets ; consultez Ă©galement O_LARGEFILE ci-dessus. C’est l’erreur spĂ©cifiĂ©e par POSIX.1 ; avant Linux 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 celui du propriĂ©taire du fichier, et l’appelant n’est pas privilĂ©giĂ©.

EPERM

La lecture a été interrompue par un signal ; consultez fnctl (2).

EROFS

Un accÚs en écriture est demandé alors que pathname réside sur un systÚme de fichiers en lecture seule.

ETXTBSY

Une écriture a été demandée alors que pathname correspond à un fichier exécutable actuellement utilisé.

ETXTBSY

pathname se rapporte Ă  un fichier actuellement utilisĂ© comme fichier d’échange et l’attribut O_TRUNC a Ă©tĂ© indiquĂ©.

ETXTBSY

pathname se rapporte à un fichier actuellement lu par le noyau (par exemple pour charger un module ou du micro-code), et un accÚs en écriture a été demandé.

EWOULDBLOCK

L’attribut O_NONBLOCK est indiquĂ©, et un bail incompatible est dĂ©tenu sur le fichier (consultez fcntl (2)).

VERSIONS

L’effet (indĂ©fini) de O_RDONLY | O_TRUNC varie selon l’implĂ©mentation. Sur de nombreux systĂšmes, le fichier est effectivement tronquĂ©.

E/S synchrones

L’option POSIX-1.2008 « E/S synchrones » dĂ©crit des variantes des E/S synchrones, ainsi que plusieurs attributs de open () permettant d’en contrĂŽler le comportement : O_SYNC , O_DSYNC et O_RSYNC . Sans chercher Ă  savoir si une implĂ©mentation accepte cette option, elle doit au moins prendre en charge l’utilisation de O_SYNC pour les fichiers normaux.

Linux met en Ɠuvre O_SYNC et O_DSYNC , mais pas O_RSYNC . De façon plus ou moins correcte, la glibc dĂ©finit O_RSYNC de façon Ă  avoir la mĂȘme valeur que O_SYNC . ( O_RSYNC est dĂ©fini dans le fichier d’en-tĂȘte du noyau Linux <asm/fcntl.h> de HP PA-RISC, mais il n’est pas utilisĂ©).

O_SYNC fournit l’exĂ©cution d’E/S synchrones avec garantie d’intĂ©gritĂ© des fichiers , ce qui signifie que les opĂ©rations d’écriture envoient les donnĂ©es et les mĂ©tadonnĂ©es associĂ©es au matĂ©riel. O_DSYNC fournit l’exĂ©cution d’E/S synchrones avec garantie d’intĂ©gritĂ© des donnĂ©es , ce qui signifie que les opĂ©rations d’écriture envoient les donnĂ©es et les mĂ©tadonnĂ©es associĂ©es au matĂ©riel, mais en envoyant seulement les mises Ă  jour des mĂ©tadonnĂ©es qui permettent d’assurer le bon dĂ©roulement d’une opĂ©ration de lecture ultĂ©rieure. L’exĂ©cution avec garantie d’intĂ©gritĂ© des donnĂ©es peut rĂ©duire le nombre d’accĂšs au disque demandĂ©s par une application qui ne nĂ©cessite pas l’exĂ©cution avec garantie d’intĂ©gritĂ© des fichiers.

Pour comprendre la diffĂ©rence entre ces deux types d’exĂ©cution, imaginez deux extraits de mĂ©tadonnĂ©es d’un fichier : l’horodatage de la derniĂšre modification ( st_mtime ) et la longueur du fichier. Toutes les opĂ©rations d’écriture modifieront l’horodatage de la derniĂšre modification, mais seules les Ă©critures en fin de fichier modifieront la longueur. L’horodatage de derniĂšre modification n’est pas nĂ©cessaire pour garantir une lecture correcte du fichier, contrairement Ă  la longueur. Ainsi, O_DSYNC transmettrait seulement la mĂ©tadonnĂ©e relative Ă  la longueur du fichier (quand O_SYNC y ajouterait l’horodatage de derniĂšre modification).

Avant Linux 2.6.33, Linux mettait seulement en Ɠuvre l’attribut O_SYNC de open (). Cependant, lorsque cet attribut Ă©tait indiquĂ©, la plupart des systĂšmes de fichiers fournissait des fonctionnalitĂ©s Ă©quivalentes Ă  l’exĂ©cution des E/S synchrones avec garantie de l’intĂ©gritĂ© des donnĂ©es (autrement dit, O_SYNC Ă©tait de fait mis en Ɠuvre comme O_DSYNC ).

A partir de Linux 2.6.33, une vĂ©ritable prise de charge de O_SYNC est fournie. Cependant, pour assurer la compatibilitĂ© ascendante binaire, O_DSYNC a Ă©tĂ© dĂ©fini avec la mĂȘme valeur que le O_SYNC « historique », et O_SYNC a Ă©tĂ© dĂ©fini comme un nouvel attribut (de deux bits) qui comprend l’attribut O_DSYNC . Ceci permet d’assurer que les applications compilĂ©es avec les nouveaux en-tĂȘtes auront au moins la sĂ©mantique de O_DSYNC avant Linux 2.6.33.

Différences entre bibliothÚque C et noyau

Depuis la glibc 2.26, la fonction enveloppe de la glibc de open () utilise l’appel systùme openat () au lieu de l’appel systùme open () du noyau. Pour certaines architectures, cela est aussi vrai avant la glibc 2.26.

STANDARDS

open ()

creat ()
openat
()

POSIX.1-2008.

openat2 (2) Linux.

Les attributs O_DIRECT , O_NOATIME , O_PATH et O_TMPFILE sont spĂ©cifiques Ă  Linux. _GNU_SOURCE doit ĂȘtre dĂ©finie pour obtenir leurs dĂ©finitions.

Les attributs O_CLOEXEC , O_DIRECTORY et O_NOFOLLOW ne sont pas spĂ©cifiĂ©s dans POSIX.1-2001, mais le sont dans POSIX.1-2008. Depuis glibc 2.12, leurs dĂ©finitions peuvent ĂȘtre obtenues en dĂ©finissant soit _POSIX_C_SOURCE avec une valeur supĂ©rieure ou Ă©gale Ă  200809L, soit _XOPEN_SOURCE avec une valeur supĂ©rieure ou Ă©gale Ă  700. Dans glibc 2.11 et les versions prĂ©cĂ©dentes, les dĂ©finitions peuvent ĂȘtre obtenues en dĂ©finissant _GNU_SOURCE .

HISTORIQUE

open ()

creat ()

SVr4, 4.3BSD, POSIX.1-2001.

openat ()

POSIX.1-2008. Linux 2.6.16, glibc 2.4.

NOTES

Sous Linux, l’attribut O_NONBLOCK est parfois utilisĂ© pour indiquer qu’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).

Notez que open () peut ouvrir des fichiers spéciaux mais creat () ne peut pas en créer, il faut utiliser mknod (2) à la place.

Si un fichier est créé, ses horodatages st_atime , st_ctime , st_mtime (respectivement heure de dernier accĂšs, de derniĂšre modification d’état, et de derniĂšre modification ; consultez stat (2)) sont dĂ©finis Ă  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.

Les fichiers du rĂ©pertoire /proc/ pid /fd affichent les descripteurs de fichier ouverts du processus ayant l’identifiant pid . Les fichiers du rĂ©pertoire /proc/ pid /fdinfo prĂ©sentent encore plus d’informations sur ces descripteurs de fichier. Voir proc (5) pour plus de dĂ©tails sur ces deux rĂ©pertoires.

Le fichier d’en-tĂȘte <asm/fcntl.h> du noyau Linux ne dĂ©finit pas O_ASYNC ; son synonyme FASYNC (dĂ©rivĂ© de BSD) l’est en revanche.

Description de fichier ouvert

Le terme « description de fichier ouvert » correspond Ă  la terminologie POSIX pour faire rĂ©fĂ©rence Ă  des entrĂ©es dans la table des fichiers ouverts du systĂšme. Dans d’autres contextes, cet objet est Ă©galement appelĂ© « objet de fichier ouvert », « gestionnaire de fichier », « entrĂ©e de la table des fichiers ouverts » ou encore, dans le jargon des dĂ©veloppeurs du noyau, struct file .

Lorsqu’un descripteur de fichiers est dupliquĂ© (au moyen de dup (2) ou d’un Ă©quivalent), la copie fait rĂ©fĂ©rence Ă  la mĂȘme description de fichier ouvert que le descripteur de fichier d’origine. Les deux descripteurs de fichier partagent donc la mĂȘme position dans le fichier et les mĂȘmes attributs d’état. Un tel partage peut Ă©galement se produire entre deux processus : un processus enfant créé au moyen de fork (2) hĂ©rite des copies des descripteurs de fichier de ses parents, et ces copies pointent vers les mĂȘmes descriptions de fichier ouvert.

Chaque opĂ©ration open (2) sur un fichier crĂ©e une nouvelle description de fichier ouvert ; ainsi, il peut y avoir plusieurs descriptions de fichier ouvert correspondant Ă  un inƓud de fichier.

Sur Linux, on peut utiliser KCMP_FILE de kcmp (2) pour tester si deux descripteurs de fichier (dans le mĂȘme processus ou dans deux processus diffĂ©rents) se rapportent Ă  la mĂȘme description de fichier ouvert.

NFS

Plusieurs problĂšmes se posent avec le protocole NFS, concernant entre autres O_SYNC , et O_NDELAY .

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

FIFO

Ouvrir les blocs de fin de FIFO en lecture et Ă©criture jusqu’à ce que l’autre fin soit Ă©galement ouverte (par un autre processus ou un autre thread). Voir fifo (7) pour plus de dĂ©tails.

Mode d’accùs au fichier

Contrairement aux autres valeurs qui peuvent ĂȘtre indiquĂ©es dans flags , les valeurs du mode d’accĂšs O_RDONLY , O_WRONLY et O_RDWR ne sont pas des bits individuels. Ils dĂ©finissent l’ordre des deux bits de poids faible de flags , et ont pour valeur respective 0, 1 et 2. En d’autres termes, l’association O_RDONLY | O_WRONLY est une erreur logique et n’a certainement pas la mĂȘme signification que O_RDWR .

Linux rĂ©serve le sens suivant au mode 3 d’accĂšs spĂ©cial et non standard (en binaire, 11) de l’attribut : vĂ©rification des droits en lecture et Ă©criture du fichier, et renvoi d’un descripteur qui ne peut ĂȘtre utilisĂ© ni en lecture, ni en Ă©criture. Ce mode d’accĂšs non standard est utilisĂ© par certains pilotes Linux afin de renvoyer un descripteur qui n’est destinĂ© qu’à des opĂ©rations ioctl (2) propres aux pĂ©riphĂ©riques.

Justification des appels openat() et des API des descripteurs de fichier derépertoires

openat () et les autres appels systĂšme similaires, ainsi que les fonctions de bibliothĂšques qui reçoivent pour argument un descripteur de fichier de rĂ©pertoire (c’est-Ă -dire, execveat (2), faccessat (2), fanotify_mark (2), fchmodat (2), fchownat (2), fspick (2), fstatat (2), futimesat (2), linkat (2), mkdirat (2), mknodat (2), mount_setattr (2), move_mount (2), name_to_handle_at (2), open_tree (2), openat2 (2), readlinkat (2), renameat (2), renameat2 (2), statx (2), symlinkat (2), unlinkat (2), utimensat (2), mkfifoat (3) et scandirat (3)) gĂšrent deux problĂšmes avec les anciennes interfaces. L’explication est ici donnĂ©e dans le contexte de l’appel openat (), mais elle est semblable pour les autres interfaces.

Tout d’abord, openat () permet Ă  une application d’éviter les problĂšmes d’accĂšs concurrents lors de l’utilisation de open () pour ouvrir des fichiers dans des rĂ©pertoires autres que le rĂ©pertoire courant. Ces problĂšmes sont dus au fait que l’un des composants du chemin donnĂ© Ă  open () peut ĂȘtre modifiĂ© parallĂšlement Ă  l’appel open (). Supposons par exemple qu’on veuille crĂ©er le fichier dir1/dir2/xxx.dep alors que le fichier dir1/dir2/xxx existe. Le problĂšme est qu’entre la vĂ©rification de son existence et l’étape de crĂ©ation du fichier, dir1 ou dir2 (qui pourraient ĂȘtre des liens symboliques) pourraient ĂȘtre modifiĂ©s pour pointer vers un autre endroit. De tels problĂšmes peuvent ĂȘtre Ă©vitĂ©s en ouvrant un descripteur de fichier sur le rĂ©pertoire cible, puis en fournissant ce descripteur comme argument dirfd de (disons) fstatat (2) et openat (). L’utilisation du descripteur de fichier dirfd a Ă©galement d’autres avantages :

-

le descripteur de fichier est une rĂ©fĂ©rence stable au rĂ©pertoire, mĂȘme si le rĂ©pertoire est renommé ;

-

le descripteur de fichier ouvert empĂȘche le systĂšme de fichiers sous-jacent d’ĂȘtre dĂ©montĂ© quand un processus dĂ©tient un rĂ©pertoire en cours de fonctionnement sur le systĂšme de fichiers.

Enfin, openat () permet d’implĂ©menter un « rĂ©pertoire courant » par thread, grĂące Ă  des descripteurs de fichier maintenus par l’application. Cette fonctionnalitĂ© peut Ă©galement ĂȘtre obtenue en jouant avec /proc/self/fd/ dirfd, mais de façon moins efficace.

L’argument dirfd de ces API peut ĂȘtre obtenu par l’utilisation de open () ou de openat () pour ouvrir un rĂ©pertoire (avec le drapeau O_RDONLY ou O_PATH ). Sinon, un tel descripteur de fichier peut ĂȘtre obtenu en appliquant un dirfd (3) au flux d’un rĂ©pertoire créé avec opendir (3).

Quand on donne aux API un argument dirfd de AT_FDCWD ou qu’un chemin indiquĂ© est absolu, ils gĂšrent leur argument de chemin de la mĂȘme maniĂšre que les API conventionnelles correspondantes. Toutefois dans ce cas, plusieurs API ont un argument flags qui offre un accĂšs Ă  cette fonctionnalitĂ© non disponible avec les interfaces conventionnelles correspondantes.

O_DIRECT

L’attribut O_DIRECT peut imposer des restrictions d’alignement pour la longueur et l’adresse des tampons de l’espace utilisateur et des dĂ©calages de fichier pour les entrĂ©es-sorties. 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. La manipulation des entrĂ©es-sorties O_DIRECT mal alignĂ©es varie aussi ; elles peuvent soit Ă©chouer avec l’erreur EINVAL soit se replier sur des entrĂ©es-sorties mises en tampon.

Depuis Linux 6.1, la prise en charge de O_DIRECT et les restrictions d’alignement pour un fichier peuvent ĂȘtre recherchĂ©es avec statx (2) en utilisant l’attribut STATX_DIOALIGN . La prise en charge de STATX_DIOALIGN varie selon le systĂšme de fichiers ; consultez statx (2).

Certains systĂšmes de fichiers fournissent leur propre interface pour rechercher les restrictions d’alignement de O_DIRECT , par exemple l’opĂ©ration XFS_IOC_DIOINFO de xfsctl (3). STATX_DIOALIGN devrait ĂȘtre utilisĂ© Ă  la place quand il est disponible.

Si aucun de ces interfaces n’est disponible, alors la prise en charge directe des entrĂ©es-sorties et les restrictions d’alignement peuvent uniquement ĂȘtre prĂ©sumĂ©es Ă  partir des caractĂ©ristiques connues du systĂšme de fichiers, du fichier individuel, des pĂ©riphĂ©riques de stockage sous-jacents et de la version du noyau. Dans Linux 2.4, la plupart des systĂšmes de fichiers basĂ©s sur des pĂ©riphĂ©riques bloc requiĂšrent que l’adresse du fichier et la longueur et l’adresse mĂ©moire de tous les segments d’entrĂ©es-sorties soient des multiples de la taille de bloc du systĂšme de fichiers (habituellement 4096 octets). Dans Linux 2.6.0, cela a Ă©tĂ© assoupli Ă  la taille du bloc logique du pĂ©riphĂ©rique bloc (habituellement 512 octets). La taille de bloc logique d’un pĂ©riphĂ©rique bloc peut ĂȘtre dĂ©terminĂ©e avec l’opĂ©ration BLKSSZGET de ioctl (2) ou avec la commande shell suivante :

blockdev --getss

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Ă©e dans Linux 2.4.10. Les noyaux Linux plus anciens ignorent simplement cet attribut. Certains systĂšmes de fichiers peuvent ne pas gĂ©rer cet attribut et open () Ă©chouera avec l’erreur EINVAL s’il est 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 et qui est dĂ©sactivĂ©e par dĂ©faut.

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.

Deux codes d’erreur diffĂ©rents – EISDIR et ENOENT — doivent ĂȘtre vĂ©rifiĂ©s pour essayer de dĂ©terminer si le noyau prend en charge la fonctionnalitĂ© O_TMPFILE .

Quand O_CREAT et O_DIRECTORY sont indiquĂ©s dans flags et que le fichier indiquĂ© par pathname n’existe pas, open () crĂ©era un fichier ordinaire (c’est-Ă -dire que O_DIRECTORY est ignorĂ©).

VOIR AUSSI

chmod (2), chown (2), close (2), dup (2), fcntl (2), link (2), lseek (2), mknod (2), mmap (2), mount (2), open_by_handle_at (2), openat2 (2), read (2), socket (2), stat (2), umask (2), unlink (2), write (2), fopen (3), acl (5), fifo (7), inode (7), path_resolution (7), symlink (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com>, Jean-Philippe MENGUAL <jpmengual@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .