Man page - fcntl64(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

fcntl

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Dupliquer un descripteur de fichier
Attributs du descripteur de fichier
Attribut d’état du fichier
Verrouillages d’enregistrements coopĂ©ratifs
Verrouillages de description de fichier ouvert (non POSIX)
Verrouillage impératif
Verrouillages perdus
Gestion des signaux
Baux
Notification de modification de fichier et de répertoire (dnotify)
Changer la capacitĂ© d’un tube
Verrouillages de fichier
Indications de lecture/écriture de fichiers
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
Verrouillages de fichier
Verrouillages d’enregistrements
Verrouillages d’enregistrements et NFS
BOGUES
F_SETFL
F_GETOWN
F_SETOWN
DĂ©tection d’interblocage
Verrouillage impératif
VOIR AUSSI
TRADUCTION

NOM

fcntl - Manipuler un descripteur de fichier

BIBLIOTHÈQUE

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

SYNOPSIS

#include <fcntl.h>

int fcntl(int fd , int op , ... /* arg */ );

DESCRIPTION

fcntl () permet de se livrer Ă  diverses opĂ©rations sur le descripteur de fichier fd . L’opĂ©ration en question est dĂ©terminĂ©e par la valeur de l’argument op .

fcntl () accepte un troisiĂšme paramĂštre optionnel. La nĂ©cessitĂ© de fournir, ou pas, ce paramĂštre dĂ©pend de op . Le paramĂštre doit ĂȘtre du type indiquĂ© entre parenthĂšses aprĂšs chaque nom de commande op (dans la plupart des cas, le type requis est un int , et le paramĂštre est identifiĂ© en utilisant le nom arg ), ou void est indiquĂ© si le paramĂštre n’est pas nĂ©cessaire.

Certaines des opĂ©rations suivantes ne sont prises en charge qu’à partir d’une version donnĂ©e du noyau Linux. La mĂ©thode prĂ©fĂ©rĂ©e pour vĂ©rifier si le noyau hĂŽte prend en charge une certaine opĂ©ration est d’invoquer fcntl () avec la valeur de op voulue et ensuite de tester si l’appel a Ă©chouĂ© avec EINVAL , indiquant que le noyau ne reconnaĂźt pas cette valeur.

Dupliquer un descripteur de fichier

F_DUPFD ( int )

Dupliquer le descripteur de fichier fd en utilisant le plus petit numéro de descripteur de fichier libre supérieur ou égal à arg . Cela est différent de dup2 (2), qui utilise exactement le descripteur de fichier transmis.

En cas de réussite, le nouveau descripteur de fichier est renvoyé.

Consultez dup (2) pour plus d’informations.

F_DUPFD_CLOEXEC ( int ; depuis Linux 2.6.24)

Comme pour F_DUPFD , mais positionner en plus l’attribut « close-on-exec » pour le descripteur de fichier dupliquĂ©. Indiquer cet attribut permet Ă  un programme d’éviter une opĂ©ration F_SETFD de fcntl () supplĂ©mentaire pour positionner l’attribut FD_CLOEXEC . Pour une explication sur ce en quoi cet attribut est utile, consultez la description de O_CLOEXEC dans open (2).

Attributs du descripteur de fichier

Les opĂ©rations suivantes manipulent les attributs associĂ©s Ă  un descripteur de fichier. Actuellement, un seul attribut est dĂ©fini : il s’agit de FD_CLOEXEC , l’attribut « close-on-exec ». Si le bit FD_CLOEXEC est positionnĂ©, le descripteur de fichier sera automatiquement fermĂ© lors d’un execve (2) rĂ©ussi (si execve (2) Ă©choue, le descripteur de fichier reste ouvert). Si le bit FD_CLOEXEC n’est pas positionnĂ©, le descripteur de fichier restera ouvert Ă  la fin d’un execve (2).
F_GETFD
( void )

Renvoyer (en tant que résultat de la fonction) les attributs du descripteur de fichier ; arg est ignoré.

F_SETFD ( int )

Positionner les attributs du descripteur de fichier avec la valeur précisée par arg .

Dans un programme multithreadĂ©, l’utilisation simultanĂ©e dans un thread de fcntl () avec F_SETFD afin de dĂ©finir l’attribut « close-on-exec » ( FD_CLOEXEC ), et de fork (2) suivi de execve (2) dans un autre thread rend le programme vulnĂ©rable Ă  une condition de concurrence pouvant provoquer la divulgation du descripteur de fichier dans le programme exĂ©cutĂ© dans le processus enfant. Consultez les dĂ©tails de l’attribut O_CLOEXEC dans open (2) qui dĂ©crivent une solution Ă  ce problĂšme.

Attribut d’état du fichier

Un descripteur de fichier dispose de certains attributs d’état, initialisĂ©s par open (2) et Ă©ventuellement modifiĂ©s par fcntl (). Les descripteurs de fichier dupliquĂ©s (obtenus avec dup (2), fcntl (F_DUPFD), fork (2), etc.) concernent la mĂȘme description de fichier ouvert, et par consĂ©quent partagent les mĂȘmes attributs d’état de fichier.

Les attributs et leurs sémantiques sont décrits dans la page open (2).
F_GETFL
( void )

Renvoyer (en tant que rĂ©sultat de la fonction) les droits d’accĂšs du fichier et les drapeaux d’état du fichier ; arg est ignorĂ©.

F_SETFL ( int )

Positionner les drapeaux d’état du fichier Ă  la valeur indiquĂ©e par arg . Les drapeaux des droits d’accĂšs au fichier ( O_RDONLY , O_WRONLY , O_RDWR ) et les attributs de crĂ©ation du fichier ( O_CREAT , O_EXCL , O_NOCTTY , O_TRUNC ) de arg sont ignorĂ©s. Sous Linux, cette opĂ©ration ne peut changer que les attributs O_APPEND , O_ASYNC , O_DIRECT , O_NOATIME et O_NONBLOCK . Modifier les attributs O_DSYNC et O_SYNC est impossible, consultez BOGUES ci-dessous.

Verrouillages d’enregistrements coopĂ©ratifs

Linux implĂ©mente les verrouillages d’enregistrements UNIX traditionnels (« associĂ©s au processus »), tels que normalisĂ©s par POSIX. Pour une alternative spĂ©cifique Ă  Linux avec de meilleures sĂ©mantiques, consultez la discussion suivante sur les verrouillages de description de fichier ouvert.

F_SETLK , F_SETLKW et F_GETLK servent Ă  gĂ©rer les verrouillages d’enregistrements (d’intervalle d’octets, de segments de fichiers ou de zones de fichiers). Le troisiĂšme argument, lock , est un pointeur sur une structure qui a au moins les champs suivants (dans un ordre non indiquĂ©).

struct flock {
...
short l_type; /* Type de verrouillage : F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* Interprétation de l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Décalage de début du verrouillage */
off_t l_len; /* Nombre d’octets du verrouillage */
pid_t l_pid; /* PID du processus bloquant notre verrou
(mis par F_GETLK et F_OFD_GETLK seulement) */
...
};

Les champs l_whence , l_start et l_len de cette structure indiquent l’intervalle d’octets Ă  verrouiller. Des octets aprĂšs la fin du fichier peuvent ĂȘtre verrouillĂ©s, mais pas des octets avant le dĂ©but du fichier.

l_start est la position de dĂ©but du verrou, et est interprĂ©tĂ© de façon relative : au dĂ©but du fichier (si l_whence vaut SEEK_SET ) ; Ă  la position actuelle dans le fichier (si l_whence vaut SEEK_CUR ) ; Ă  la fin du fichier (si l_whence vaut SEEK_END ). Dans les deux derniers cas, l_start peut ĂȘtre un nombre nĂ©gatif, Ă  partir du moment oĂč la position fournie ne pointe pas avant le dĂ©but du fichier.

l_len indique le nombre d’octets Ă  verrouiller. Si l_len est positif, alors l’intervalle Ă  verrouiller couvre les octets Ă  partir de l_start jusqu’à l_start + l_len -1 (inclus). Indiquer 0 dans l_len a une signification particuliĂšre : cela verrouille tous les octets Ă  partir de la position indiquĂ©e par l_whence et l_start jusqu’à la fin du fichier, quelle que soit la taille que prendra le fichier.

POSIX.1-2001 permet (mais n’impose pas) Ă  une implĂ©mentation de prendre en charge des valeurs de l_len nĂ©gatives ; si l_len est nĂ©gatif, l’intervalle dĂ©crivant le verrou lock couvre les octets l_start + l_len jusqu’à l_start -1 inclus. Cela est gĂ©rĂ© par Linux 2.4.21 et Linux 2.5.49.

Le champ l_type peut servir Ă  placer un verrou en lecture ( F_RDLCK ) ou en Ă©criture ( F_WRLCK ) sur un fichier. Un nombre quelconque de processus peuvent tenir un verrou en lecture (partagĂ©), sur une zone d’un fichier, mais un seul peut avoir un verrou en Ă©criture (exclusif). Un verrou en Ă©criture exclut tous les autres verrous, aussi bien en lecture qu’en Ă©criture. Un processus donnĂ© ne peut tenir qu’un seul verrou sur une zone d’un fichier ; si un nouveau verrou est appliquĂ© sur une zone dĂ©jĂ  verrouillĂ©e, alors le verrou prĂ©cĂ©dent est converti suivant le nouveau type. Ces conversions pourraient entraĂźner le dĂ©coupage, la rĂ©duction ou l’extension du verrou existant si le nombre d’octets du nouveau verrou ne coĂŻncide pas exactement avec celui de l’ancien.
F_SETLK
( struct flock * )

AcquĂ©rir (si l_type vaut F_RDLCK ou F_WRLCK ) ou libĂ©rer (si l_type vaut F_UNLCK ) le verrou sur les octets indiquĂ©s par les champs l_whence , l_start , et l_len de lock . Si un conflit avec un verrou tenu par un autre processus existe, cet appel renvoie -1 et positionne errno aux valeurs EACCES ou EAGAIN (l’erreur renvoyĂ©e dans ce cas dĂ©pend des implĂ©mentations, donc POSIX impose aux applications portables de vĂ©rifier les deux erreurs).

F_SETLKW ( struct flock * )

Comme F_SETLK , mais attendre la libĂ©ration du verrou au lieu de renvoyer une erreur si un verrou en conflit est utilisĂ© sur le fichier. Si un signal est reçu pendant l’attente, l’appel est interrompu et renverra immĂ©diatement (aprĂšs le retour du gestionnaire de signaux) la valeur -1 . errno sera remplie avec la valeur EINTR ; consultez signal (7).

F_GETLK ( struct flock * )

En entrée dans cette routine, lock décrit un verrou que nous aimerions placer sur le fichier. Si le verrouillage est possible, fcntl () ne le fait pas, mais renvoie F_UNLCK dans le champ l_type de lock et laisse les autres champs de la structure inchangés.

Si un ou plusieurs verrouillages incompatibles empĂȘchaient l’action, alors fcntl () renvoie des informations sur l’un de ces verrous dans les champs l_type , l_whence , l_start , et l_len de lock . Si le verrouillage en conflit est un verrouillage d’enregistrements UNIX traditionnels (« associĂ© au processus »), alors le champ l_pid est dĂ©fini avec le PID du processus dĂ©tenant ce verrou. Si le verrouillage en conflit est un verrouillage de description de fichier ouvert, alors l_pid est dĂ©fini Ă  -1 . Remarquez que les renseignements renvoyĂ©s pourraient dĂ©jĂ  ĂȘtre pĂ©rimĂ©s au moment ou l’appelant les inspecte.

Pour pouvoir placer un verrou en lecture, fd doit ĂȘtre ouvert au moins en lecture. Pour placer un verrou en Ă©criture, fd doit ĂȘtre ouvert en Ă©criture. Pour placer les deux types de verrous, il faut une ouverture en lecture/Ă©criture.

Lors du placement de verrous avec F_SETLKW , le noyau dĂ©tecte les interblocages ( deadlocks ), au moyen desquels au moins deux processus ont leurs demandes de verrouillage rĂ©ciproquement bloquĂ©es par des verrous dĂ©tenus par d’autres processus. Par exemple, supposons qu’un processus A dĂ©tient un verrou d’écriture sur l’octet 100 d’un fichier et qu’un processus B dĂ©tient un verrou d’écriture sur l’octet 200. Si les deux processus tentent alors de verrouiller l’octet dĂ©jĂ  verrouillĂ© par l’autre processus en utilisant F_SETLKW , alors, sans dĂ©tection d’interblocage, les deux processus resteront bloquĂ©s indĂ©finiment. Quand le noyau dĂ©tecte ce type d’interblocages, il force l’une des demandes bloquantes de verrouillage Ă  Ă©chouer immĂ©diatement avec l’erreur EDEADLK ; une application qui rencontre ce type d’erreur devrait libĂ©rer certains de ses verrous pour permettre Ă  d’autres applications de continuer avant de tenter d’obtenir de nouveau les verrous dont elle a besoin. Les interblocages circulaires, impliquant plus de deux processus, sont Ă©galement dĂ©tectĂ©s. Remarquez, cependant, que l’algorithme de dĂ©tection d’interblocages du noyau a ses limites, consultez BOGUES .

Outre la suppression par un F_UNLCK explicite, les verrous sont automatiquement libérés lorsque le processus se termine.

Les verrouillages d’enregistrements ne sont pas hĂ©ritĂ©s par les enfants lors d’un fork (2), mais sont conservĂ©s Ă  la fin d’un execve (2).

À cause des tampons gĂ©rĂ©s par la bibliothĂšque stdio (3), l’utilisation des verrous d’enregistrements avec les routines de celle-ci est dĂ©conseillĂ©e. Utilisez plutĂŽt read (2) et write (2).

Les verrouillages d’enregistrements dĂ©crits prĂ©cĂ©demment sont associĂ©s au processus (contrairement aux verrouillages de description de fichier ouvert dĂ©crits ci-dessous). Cela a quelques consĂ©quences malheureuses.

-

Si le processus ferme l’un des descripteurs se rĂ©fĂ©rant Ă  un fichier, alors tous les verrous du processus sur ce fichier sont libĂ©rĂ©s, quels que soient le ou les descripteurs de fichier sur lesquels les verrous avaient Ă©tĂ© obtenus. C’est dangereux : cela signifie qu’un processus peut perdre ses verrous sur un fichier comme /etc/passwd ou /etc/mtab si, pour une raison quelconque, une fonction de bibliothĂšque dĂ©cide d’ouvrir, lire, puis refermer le mĂȘme fichier.

-

Les threads d’un processus partagent les verrous. Autrement dit, un programme multithreadĂ© ne pas pas utiliser de verrouillage d’enregistrement pour s’assurer que les threads ne vont pas accĂ©der simultanĂ©ment Ă  la mĂȘme zone d’un fichier.

Les verrouillages de description de fichier ouvert apportent une solution Ă  ces deux problĂšmes.

Verrouillages de description de fichier ouvert (non POSIX)

Les verrouillages de description de fichier ouvert sont des verrouillages d’intervalle d’octets coopĂ©ratifs dont le fonctionnement est identique en presque tout point aux verrouillages d’enregistrements traditionnels dĂ©crits prĂ©cĂ©demment. Ce type de verrouillage est spĂ©cifique Ă  Linux et disponible depuis la version 3.15. Pour une explication des descriptions de fichier ouvert, consultez open (2).

La principale diffĂ©rence entre les deux types de verrouillage est que les verrouillages d’enregistrements traditionnels sont associĂ©s Ă  un processus, alors que les verrouillages de description de fichier ouvert sont associĂ©s Ă  la description de fichier ouvert sur laquelle ils sont obtenus, tout comme les verrous obtenus avec flock (2). Par consĂ©quent (et contrairement aux verrouillages d’enregistrements coopĂ©ratifs traditionnels), les verrouillages de description de fichier ouvert sont hĂ©ritĂ©s entre fork (2) (et clone (2) avec CLONE_FILES ) et ne sont automatiquement libĂ©rĂ©s que lors de la derniĂšre fermeture de la description de fichier ouvert, au lieu d’ĂȘtre libĂ©rĂ©s lors de n’importe quelle fermeture du fichier.

Les combinaisons de verrouillage de conflit (Ă  savoir un verrouillage en lecture et en Ă©criture, ou deux verrouillages en Ă©criture), oĂč l’un est un verrouillage de description de fichier ouvert, et l’autre un verrouillage traditionnel d’enregistrement sont toujours en conflit mĂȘme lorsqu’ils sont acquis par le mĂȘme processus sur le mĂȘme descripteur de fichier.

Les verrouillages de description de fichier ouvert placĂ©s Ă  l’aide de la mĂȘme description de fichier ouvert (c’est-Ă -dire Ă  l’aide du mĂȘme descripteur de fichier ou Ă  l’aide d’un descripteur de fichier dupliquĂ© par fork (2), dup (2), fcntl (2) F_DUPFD , etc.) sont toujours compatibles : si un nouveau verrou est placĂ© sur une zone dĂ©jĂ  verrouillĂ©e, alors le verrou existant est converti suivant le nouveau (ces conversions pourraient avoir pour consĂ©quence le dĂ©coupage, la rĂ©duction ou l’extension du verrou existant comme Ă©voquĂ© prĂ©cĂ©demment).

En revanche, les verrouillages de description de fichier ouvert peuvent ĂȘtre en conflit entre eux quand ils sont obtenus Ă  l’aide de descriptions de fichier ouvert diffĂ©rentes. Ainsi, les threads dans un programme multithreadĂ© peuvent utiliser des verrouillages de description de fichier ouvert pour synchroniser l’accĂšs Ă  une zone de fichier si tous les threads rĂ©alisent leur propre appel d’ open (2) sur le fichier et utilisent les verrouillages Ă  l’aide du descripteur de fichier qui en rĂ©sulte.

Comme avec les verrouillages coopĂ©ratifs traditionnels, le troisiĂšme argument de fcntl (), lock , est un pointeur vers une structure flock . Contrairement aux verrouillages d’enregistrements traditionnels, le champ l_pid de cette structure doit ĂȘtre mis Ă  zĂ©ro lors de l’utilisation des opĂ©rations dĂ©crites ci-dessous.

Les opĂ©rations permettant d’interagir avec les verrouillages de description de fichier ouvert sont similaires Ă  celles utilisĂ©es avec les verrouillages traditionnels.
F_OFD_SETLK
( struct flock * )

Acquérir (si l_type vaut F_RDLCK ou F_WRLCK ) ou libérer (si l_type vaut F_UNLCK ) un verrou de description de fichier ouvert sur les octets indiqués par les champs l_whence , l_start et l_len de lock . Si un conflit avec un verrou détenu par un autre processus existe, cet appel renvoie -1 et définit errno à EAGAIN .

F_OFD_SETLKW ( struct flock * )

Comme F_OFD_SETLK , mais si un verrou en conflit existe sur le fichier attendre la libĂ©ration du verrou. Si un signal Ă  intercepter est reçu pendant l’attente, l’appel est interrompu et renverra immĂ©diatement (aprĂšs renvoi du gestionnaire de signaux) la valeur -1 et errno sera dĂ©finie Ă  EINTR ; consultez signal (7).

F_OFD_GETLK ( struct flock * )

En entrĂ©e dans cette routine, lock dĂ©crit un verrou de description de fichier ouvert que nous aimerions placer sur le fichier. Si le verrouillage est possible, fcntl () ne le fait pas, mais renvoie F_UNLCK dans le champ l_type de lock et laisse les autres champs de la structure inchangĂ©s. Si un ou plusieurs verrouillages incompatibles empĂȘchaient l’action, alors des informations sur l’un de ces verrous sont renvoyĂ©s Ă  l’aide de lock , comme dĂ©crit prĂ©cĂ©demment pour F_GETLK .

Dans l’implĂ©mentation actuelle, aucune dĂ©tection d’interblocage n’est rĂ©alisĂ©e pour les verrouillages de description de fichier ouvert (contrairement aux verrouillages d’enregistrements associĂ©s au processus, pour lesquels le noyau rĂ©alise une dĂ©tection d’interblocage).

Verrouillage impératif

Attention : l’implĂ©mentation Linux du verrouillage obligatoire n’est pas fiable. Voir BOGUES ci-dessous. À cause de ces bogues et du fait que cette fonction soit vue comme peu utilisĂ©e, depuis Linux 4.5, le verrouillage obligatoire est devenu une fonction facultative gĂ©rĂ©e par une option de configuration ( CONFIG_MANDATORY_FILE_LOCKING ). Cette fonctionnalitĂ© n’est plus prise en charge depuis Linux 5.15 et supĂ©rieur.

Par dĂ©faut, Ă  la fois les verrouillages d’enregistrements traditionnels (associĂ©s au processus) et ceux de description de fichier ouvert sont coopĂ©ratifs. Les verrouillages coopĂ©ratifs ne sont pas imposĂ©s, donc ils ne fonctionnent qu’entre processus qui les utilisent.

Les deux types de verrouillages peuvent aussi ĂȘtre impĂ©ratifs. Les verrous impĂ©ratifs sont appliquĂ©s Ă  tous les processus. Si un processus tente d’effectuer un accĂšs incompatible (par exemple read (2) ou write (2)) sur une zone d’un fichier qui a un verrou impĂ©ratif, le rĂ©sultat dĂ©pend de l’attribut O_NONBLOCK du descripteur de fichier. S’il n’est pas activĂ©, l’appel systĂšme est bloquĂ© jusqu’à ce que le verrou soit enlevĂ© ou converti en un mode compatible avec l’accĂšs demandĂ©. Si l’attribut O_NONBLOCK est activĂ©, l’appel systĂšme Ă©choue avec l’erreur EAGAIN .

Pour utiliser des verrous impĂ©ratifs, ce type de verrouillage doit ĂȘtre activĂ© sur le systĂšme de fichiers contenant le fichier Ă  verrouiller (en utilisant l’option « -o mand » de mount (8)), ou l’attribut MS_MANDLOCK de mount (2). Le verrouillage impĂ©ratif est activĂ© pour un fichier en dĂ©sactivant la permission d’exĂ©cution du groupe et en activant le bit de permission Set-GID (consultez chmod (1) et chmod (2)).

Le verrouillage impĂ©ratif n’est pas dĂ©fini par POSIX. Certains autres systĂšmes permettent Ă©galement d’utiliser le verrouillage impĂ©ratif, mais la façon de l’activer dĂ©pend des systĂšmes.

Verrouillages perdus

Quand un verrou d’observation est obtenu sur un systĂšme de fichiers en rĂ©seau comme NFS, il est possible que le verrou soit perdu. Cela peut arriver suite Ă  une action d’administration sur le serveur ou Ă  une partition du rĂ©seau (Ă  savoir une perte de la connexion rĂ©seau avec le serveur) qui dure assez pour que le serveur pense que le client ne fonctionne plus.

Quand un systĂšme de fichiers dĂ©termine qu’un verrou est perdu, les futures requĂȘtes read (2) ou write (2) peuvent Ă©chouer avec l’erreur EIO . Cette erreur persistera jusqu’à la suppression du verrou ou la fermeture du descripteur de fichier. Depuis Linux 3.12, cela se produit au moins sur NFSv4 (y compris toutes les versions mineures).

Certaines versions d’UNIX envoient un signal ( SIGLOST ) dans ce cas. Linux ne dĂ©finit pas ce signal et il ne fournit pas de notification asynchrone de perte de verrous.

Gestion des signaux

F_GETOWN , F_SETOWN , F_GETOWN_EX , F_SETOWN_EX , F_GETSIG et F_SETSIG servent Ă  gĂ©rer les signaux de disponibilitĂ© d’entrĂ©e-sortie :
F_GETOWN
( void )

Renvoyer (comme rĂ©sultat de la fonction) le PID ou l’ID de processus qui reçoit les signaux SIGIO et SIGURG pour les Ă©vĂ©nements concernant le descripteur de fichier fd . Les ID de processus sont renvoyĂ©s sous forme de valeurs positives ; les ID de groupe de processus sont renvoyĂ©s sous forme de valeurs nĂ©gatives (mais consultez la section BOGUES ci-dessous). arg est ignorĂ©.

F_SETOWN ( int )

DĂ©finir le PID ou l’identifiant de processus qui recevront les signaux SIGIO et SIGURG pour les Ă©vĂ©nements concernant le descripteur fd . L’ID de processus ou de groupe de processus cible est indiquĂ© dans arg . L’ID d’un processus est indiquĂ© sous forme d’une valeur positive ; l’ID d’un groupe de processus est formulĂ© en tant que valeur nĂ©gative. En gĂ©nĂ©ral, le processus appelant indique son propre PID comme argument ( arg est donc getpid (2)).

Outre la dĂ©finition du propriĂ©taire du descripteur de fichier, vous pourriez aussi activer la gĂ©nĂ©ration de signaux sur le descripteur de fichier. Cela se fait en utilisant l’opĂ©ration F_SETFL de fcntl () pour positionner le drapeau d’état du fichier O_ASYNC sur le descripteur de fichier. Par consĂ©quent, un signal SIGIO est envoyĂ© dĂšs que l’entrĂ©e ou la sortie sont possibles sur ce descripteur. L’opĂ©ration F_SETSIG de fcntl () peut ĂȘtre utilisĂ©e pour recevoir un autre signal que SIGIO .

L’envoi d’un signal au processus (ou groupe de processus) propriĂ©taire indiquĂ© par F_SETOWN est conditionnĂ© par les mĂȘmes vĂ©rifications de permissions que l’envoi d’un signal par kill (2), oĂč le processus envoyant le signal est celui qui utilise F_SETOWN (mais consultez la section BOGUES ci-dessous). Si cette vĂ©rification Ă©choue, le signal est ignorĂ© silencieusement. Note : l’opĂ©ration F_SETOWN enregistre les droits de l’appelant utilisĂ©s lors de l’appel fcntl () pour les vĂ©rifications de permissions.

Si le descripteur fd est un socket, F_SETOWN permet Ă©galement la rĂ©ception de signaux SIGURG lorsque des donnĂ©es hors-bande arrivent sur le socket. ( SIGURG est Ă©mis dans toutes les situations oĂč l’appel select (2) aurait indiquĂ© que le socket est dans une « situation exceptionnelle ».)

Le paragraphe ci-dessous Ă©tait pertinent Linux 2.6.x, jusqu’à Linux 2.6.11 inclus :

Si une valeur non nulle est passĂ©e Ă  F_SETSIG dans un processus multithreadĂ© utilisant une bibliothĂšque de threads gĂ©rant les groupes de threads (par exemple NPTL), une valeur positive passĂ©e Ă  F_SETOWN a une signification diffĂ©rente : au lieu d’ĂȘtre un PID identifiant tout un processus, il s’agit d’un identifiant de thread, rĂ©fĂ©rant Ă  un thread spĂ©cifique dans un processus. Par consĂ©quent, il peut ĂȘtre nĂ©cessaire de passer Ă  F_SETOWN la valeur renvoyĂ©e par gettid (2) plutĂŽt que celle renvoyĂ©e par getpid (2) pour obtenir les rĂ©sultats souhaitĂ©s si F_SETSIG est utilisĂ©. (Dans les implĂ©mentations actuelles des threads sous Linux, l’identifiant de thread (TID) du thread principal est son identifiant de processus. Cela signifie qu’un processus avec un seul thread peut utiliser indiffĂ©remment gettid (2) ou getpid (2).) Veuillez toutefois noter que les remarques de ce paragraphe ne s’appliquent pas au signal SIGURG gĂ©nĂ©rĂ© lorsque des donnĂ©es hors-bande sont disponibles sur un socket : ce signal est toujours envoyĂ© soit Ă  un processus, soit Ă  un groupe de processus, selon la valeur donnĂ©e Ă  F_SETOWN .

Le comportement ci-dessus a Ă©tĂ© supprimĂ© par accident dans Linux 2.6.12, et ne sera pas remis. À partir de Linux 2.6.32, utilisez F_SETOWN_EX pour envoyer les signaux SIGIO et SIGURG Ă  un thread en particulier.

F_GETOWN_EX ( struct f_owner_ex * ) (depuis Linux 2.6.32)

Renvoyer les paramĂštres du propriĂ©taire du descripteur de fichier actuel, tels que dĂ©finis par une utilisation antĂ©riefure de F_SETOWN_EX . L’information est renvoyĂ©e dans la structure pointĂ©e par arg , qui a la forme suivante :

struct f_owner_ex {
int type;
pid_t pid;
};

Le champ type aura l’une des valeurs F_OWNER_TID , F_OWNER_PID ou F_OWNER_PGRP . Le champ pid est un entier positif reprĂ©sentant un identifiant de thread, de processus ou de groupe de processus. Consultez F_SETOWN_EX pour plus de dĂ©tails.

F_SETOWN_EX ( struct f_owner_ex * ) (depuis Linux 2.6.32)

Cette opĂ©ration effectue une tĂąche similaire Ă  F_SETOWN . Elle autorise l’appelant Ă  diriger les signaux de disponibilitĂ© d’entrĂ©es-sorties vers un thread, un processus ou un groupe de processus spĂ©cifiques. L’appellant indique le destinataire des signaux avec arg , qui est un pointeur vers une structure f_owner_ex . Le champ type possĂšde l’une des valeurs suivantes, qui dĂ©finit comment pid est interprĂ©té :
F_OWNER_TID

Envoyer le signal au thread dont l’identifiant (la valeur renvoyĂ©e par un appel Ă  clone (2) ou gettid (2)) est indiquĂ© par pid .

F_OWNER_PID

Envoyer le signal au processus dont l’identifiant est indiquĂ© par pid .

F_OWNER_PGRP

Envoyer le signal au groupe de processus dont l’identifiant est indiquĂ© par pid . Notez que, Ă  la diffĂ©rence de F_SETOWN , un identifiant de groupe de processus est indiquĂ© ici avec une valeur positive.

F_GETSIG ( void )

Renvoyer (comme rĂ©sultat de la fonction) le numĂ©ro du signal Ă©mis lorsque l’entrĂ©e ou la sortie deviennent possibles. Une valeur nulle signifie l’émission de SIGIO . Toute autre valeur (y compris SIGIO ) prĂ©cise le signal Ă©mis, et des informations supplĂ©mentaires seront disponibles pour le gestionnaire s’il est installĂ© avec SA_SIGINFO . arg est ignorĂ©.

F_SETSIG ( int )

DĂ©finir le signal Ă  Ă©mettre lorsque l’entrĂ©e ou la sortie deviennent possibles Ă  la valeur fournie par arg . Une valeur nulle signifie l’émission de SIGIO . Toute autre valeur (y compris SIGIO ) prĂ©cise le signal Ă  Ă©mettre, et des informations supplĂ©mentaires seront disponibles pour le gestionnaire s’il est installĂ© avec SA_SIGINFO .

En utilisant F_SETSIG avec une valeur non nulle, et en configurant SA_SIGINFO pour le gestionnaire (consultez sigaction (2)), des informations supplĂ©mentaires sur les Ă©vĂ©nements d’entrĂ©es-sorties sont fournies au gestionnaire Ă  travers une structure siginfo_t . Si le champ si_code indique que la source est SI_SIGIO , le champ si_fd fournit le descripteur du fichier concernĂ© par l’évĂ©nement. Sinon, il n’y a pas d’indication de descripteurs de fichier en attente, et il faut utiliser les mĂ©canismes habituels ( select (2), poll (2), read (2) avec O_NONBLOCK configurĂ©, etc.) pour dĂ©terminer quels descripteurs de fichier sont disponibles pour les entrĂ©es-sorties.

Remarquez que le descripteur de fichier fourni dans si_fd est celui indiquĂ© lors de l’opĂ©ration F_SETSIG . Cela peut provoquer un effet de bord inhabituel. Si le descripteur de fichier est dupliquĂ© ( dup (2) ou Ă©quivalent), et si le descripteur de fichier d’origine est fermĂ©, alors des Ă©vĂ©nements E/S continueront Ă  ĂȘtre Ă©mis mais le champ si_fd contiendra le numĂ©ro du descripteur de fichier Ă  prĂ©sent fermĂ©.

En sĂ©lectionnant un signal temps rĂ©el (valeur >= SIGRTMIN ), de multiples Ă©vĂ©nements d’entrĂ©es-sorties peuvent ĂȘtre mĂ©morisĂ©s avec le mĂȘme numĂ©ro (la mĂ©morisation dĂ©pend de la mĂ©moire disponible). Des informations supplĂ©mentaires sont disponibles, comme ci-dessus, si SA_SIGINFO est configurĂ© pour le gestionnaire.

Notez que Linux impose une limite sur le nombre de signaux temps rĂ©el qui peuvent ĂȘtre mis en attente pour un processus (consultez getrlimit (2) et signal (7)), et si cette limite est atteinte, le noyau change de comportement et envoie SIGIO , et ce signal est dĂ©livrĂ© au processus entier plutĂŽt qu’au thread spĂ©cifique.

En utilisant ces mĂ©canismes, un programme peut implĂ©menter des entrĂ©es-sorties totalement asynchrones, la plupart du temps sans avoir besoin d’invoquer select (2) ou poll (2).

L’utilisation de O_ASYNC est spĂ©cifique Ă  BSD et Linux. La seule utilisation de F_GETOWN et F_SETOWN spĂ©cifiĂ©e dans POSIX.1 est en conjonction avec l’utilisation du signal SIGURG sur les sockets (POSIX ne spĂ©cifie pas le signal SIGIO ). F_GETOWN_EX , F_SETOWN_EX , F_GETSIG et F_SETSIG sont spĂ©cifiques Ă  Linux. POSIX dispose d’entrĂ©es-sorties asynchrones et de la structure aio_sigevent pour effectuer la mĂȘme chose. Cela est Ă©galement disponible sous Linux dans la bibliothĂšque GNU C (glibc).

Baux

F_SETLEASE et F_GETLEASE (depuis Linux 2.4) servent respectivement Ă  Ă©tablir un nouveau bail et Ă  consulter le bail actuel sur le descripteur de fichier indiquĂ© par fd . (NdT : je traduis « lease » par « bail », faute de terme plus technique.) Le bail sur un fichier fournit un mĂ©canisme par lequel un processus dĂ©tenteur du bail est averti (par dĂ©livrance d’un signal) lorsqu’un autre processus (le « casseur de bail ») essaie d’appeler open (2) ou truncate (2) sur le fichier vers lequel pointe ce descripteur de fichier.
F_SETLEASE
( int )

DĂ©finir ou supprimer un bail de fichier en fonction de la valeur fournie dans l’entier arg :
F_RDLCK

Prendre un bail en lecture. Le processus appelant sera prĂ©venu lorsqu’un autre processus ouvrira le fichier en Ă©criture ou le tronquera. Un bail en lecture ne peut ĂȘtre placĂ© que sur un descripteur de fichier ouvert en lecture seule.

F_WRLCK

Prendre un bail en Ă©criture. Le processus appelant sera prĂ©venu lorsqu’un autre processus ouvrira le fichier (en lecture ou Ă©criture) ou le tronquera. Un bail en Ă©criture ne peut ĂȘtre pris sur le fichier que s’il n’y a aucun autre descripteur de fichier ouvert pour le fichier.

F_UNLCK

Supprimer le bail sur un fichier.

Les baux sont associĂ©s Ă  une description de fichier ouvert (consultez open (2)). Cela signifie que les descripteurs de fichier dupliquĂ©s (créés par, par exemple, fork (2) ou dup (2)) font rĂ©fĂ©rence au mĂȘme bail, et que ce bail peut ĂȘtre modifiĂ© ou rĂ©siliĂ© par n’importe lequel de ces descripteurs. De plus, le bail est rĂ©siliĂ© soit par une opĂ©ration F_UNLCK explicite sur n’importe lequel de ces descripteurs dupliquĂ©s, soit lorsque tous ces descripteurs ont Ă©tĂ© fermĂ©s.

Les baux ne peuvent ĂȘtre pris que sur des fichiers normaux. Un processus non privilĂ©giĂ© ne peut prendre un bail que sur un fichier dont l’UID (le propriĂ©taire) correspond au FS-UID du processus. Un processus possĂ©dant la capacitĂ© CAP_LEASE peut prendre un bail sur n’importe quel fichier.
F_GETLEASE
( void )

Indiquer le type de bail possédé sur le descripteur de fichier fd en renvoyant F_RDLCK , F_WRLCK , ou F_UNLCK , signifiant respectivement que le processus appelant a un bail en lecture, écriture, ou pas de bail sur le fichier. arg est ignoré.

Lorsqu’un processus (le « casseur de bail ») appelle open (2) ou truncate (2) en conflit avec un bail Ă©tabli par F_SETLEASE , l’appel systĂšme est bloquĂ© par le noyau et le noyau avertit le processus tenant le bail par l’envoi d’un signal ( SIGIO par dĂ©faut). Le tenant du bail doit rĂ©pondre Ă  ce signal en effectuant tout le nettoyage nĂ©cessaire pour que le fichier soit accessible par un autre processus (par exemple en vidant des tampons internes) et en supprimant ou dĂ©classant son bail. Un bail est supprimĂ© en appelant l’opĂ©ration F_SETLEASE avec arg valant F_UNLCK . Si le tenant du bail possĂšde un bail en Ă©criture sur le fichier et que le casseur de bail ouvre le fichier en lecture, il est suffisant que le tenant du bail dĂ©classe le bail en un bail en lecture. Cela est effectuĂ© en appelant l’opĂ©ration F_SETLEASE avec arg valant F_RDLCK .

Si le dĂ©tenteur du bail n’arrive pas Ă  le dĂ©classer ou le supprimer avant le nombre de secondes indiquĂ© dans /proc/sys/fs/lease-break-time alors le noyau supprimera ou dĂ©classera de force le bail du processus qui le dĂ©tient.

DĂšs qu’un cassage de bail a Ă©tĂ© commencĂ©, F_GETLEASE renvoie le type de bail cible ( F_RDLCK ou F_UNLCK , en fonction de ce qui serait compatible avec le casseur de bail) jusqu’à ce que le dĂ©tenteur du bail ne le dĂ©classe ou le supprime volontairement, ou que le noyau ne soit forcĂ© Ă  le faire aprĂšs expiration du dĂ©lai de cassage de bail.

DĂšs que le bail a Ă©tĂ©, de grĂ© ou de force, rĂ©siliĂ© ou dĂ©classĂ© et en supposant que le casseur de bail n’a pas dĂ©bloquĂ© son appel systĂšme, le noyau permet Ă  ce dernier de se dĂ©rouler.

Si l’appel Ă  open (2) ou truncate (2) du casseur de bail est interrompu par un gestionnaire de signal, l’appel systĂšme Ă©choue avec l’erreur EINTR , mais les autres Ă©tapes dĂ©crites ci-dessous se dĂ©roulent normalement. Si le casseur de bail est tuĂ© par un signal pendant que son appel systĂšme open (2) ou truncate (2) bloque, tout se dĂ©roule comme dĂ©crit ci-dessus. De mĂȘme, si le casseur de bail utilise l’option O_NONBLOCK de open (2), l’appel retourne immĂ©diatement avec l’erreur EWOULDBLOCK , mais les autres Ă©tapes se dĂ©roulent comme dĂ©crit ci-dessus.

Le signal de notification par dĂ©faut pour le tenant du bail est SIGIO , mais on peut le modifier avec l’opĂ©ration F_SETSIG de la fonction fcntl (). Si une opĂ©ration F_SETSIG est rĂ©alisĂ©e (mĂȘme pour SIGIO ), et si le gestionnaire de signal est installĂ© avec SA_SIGINFO , alors il recevra une structure siginfo_t en second argument, et le champ si_fd contiendra le descripteur de fichier du bail oĂč il y a eu une tentative d’accĂšs par un autre processus. (Cela sert si le processus tient des baux sur plusieurs fichiers.)

Notification de modification de fichier et de répertoire (dnotify)

F_NOTIFY ( int )

(Depuis Linux 2.4) Fournir un avertissement lorsque le rĂ©pertoire correspondant Ă  fd ou l’un des fichiers qu’il contient est modifiĂ©. Les Ă©vĂ©nements Ă  notifier sont prĂ©cisĂ©s dans arg , sous forme de masque regroupant par un OU binaire zĂ©ro, une ou plusieurs des constantes suivantes :
DN_ACCESS

AccĂšs Ă  un fichier ( read (2), pread (2), readv (2) et similaires)

DN_MODIFY

Modification d’un fichier ( write (2), pwrite (2), writev (2), truncate (2), ftruncate (2) et similaires).

DN_CREATE

CrĂ©ation d’un fichier ( open (2), creat (2), mknod (2), mkdir (2), link (2), symlink (2), rename (2) dans ce rĂ©pertoire).

DN_DELETE

Suppression d’un fichier ( unlink (2), rename (2) dans un autre rĂ©pertoire, rmdir (2)).

DN_RENAME

Un fichier a Ă©tĂ© renommĂ© dans le mĂȘme rĂ©pertoire ( rename (2)).

DN_ATTRIB

Les attributs d’un fichier ont Ă©tĂ© modifiĂ©s ( chown (2), chmod (2), utime (2), utimensat (2) et similaires).

(Afin d’obtenir ces dĂ©finitions, la macro _GNU_SOURCE doit ĂȘtre dĂ©finie avant d’inclure tout fichier d’en-tĂȘte).

Les notifications de rĂ©pertoire sont habituellement uniques, et l’application doit rĂ©enregistrer une demande pour les notifications ultĂ©rieures. Inversement, si DN_MULTISHOT est incluse dans arg , les notifications resteront en effet jusqu’à une demande explicite de suppression.

Une sĂ©rie de F_NOTIFY sont cumulĂ©s, les Ă©vĂ©nements dĂ©crits dans arg Ă©tant ajoutĂ©s Ă  l’ensemble des Ă©vĂ©nements dĂ©jĂ  surveillĂ©s. Pour supprimer les notifications de tous les Ă©vĂ©nements, il faut invoquer F_NOTIFY avec arg valant 0 .

La notification se produit par l’occurrence d’un signal. Le signal par dĂ©faut est SIGIO , mais on peut le changer avec l’opĂ©ration F_SETSIG de fcntl () (remarquez que SIGIO est un des signaux standards sans file d’attente ; basculer vers l’utilisation d’un signal temps rĂ©el signifie que plusieurs notifications peuvent ĂȘtre mises en attente dans le processus). Dans ce cas, le gestionnaire de signal reçoit une structure siginfo_t en second argument (si le gestionnaire a Ă©tĂ© installĂ© avec SA_SIGINFO ) dont le champ si_fd contient le descripteur du fichier qui a dĂ©clenchĂ© la notification (utile pour superviser plusieurs rĂ©pertoires).

En outre, avec DN_MULTISHOT , un signal temps rĂ©el devrait ĂȘtre utilisĂ© pour la notification pour pouvoir empiler les notifications successives.

Remarque : les nouvelles applications devraient utiliser l’interface inotify (disponible depuis Linux 2.6.13), qui fournit une bien meilleure interface pour obtenir des notifications d’évĂ©nements sur le systĂšme de fichiers. Consultez inotify (7).

Changer la capacitĂ© d’un tube

F_SETPIPE_SZ ( int ; depuis Linux 2.6.35)

Changer la capacitĂ© du tube rĂ©fĂ©rencĂ© par fd pour contenir au moins arg octets. Un processus non privilĂ©giĂ© peut ajuster la capacitĂ© d’un tube Ă  toute valeur comprise entre la taille de page du systĂšme et la limite dĂ©finie dans /proc/sys/fs/pipe-max-size (consultez proc (5)). Les tentatives pour dĂ©finir la capacitĂ© du tube en dessous de la taille de page sont silencieusement arrondies Ă  la taille de page. Les tentatives d’un processus non privilĂ©giĂ© pour dĂ©finir la capacitĂ© du tube au dessus de /proc/sys/fs/pipe-max-size renvoie l’erreur EPERM ; un processus privilĂ©giĂ© ( CAP_SYS_RESOURCE ) peut passer outre cette limite.

Lors de l’affectation d’un tampon Ă  un tube, le noyau peut utiliser une capacitĂ© supĂ©rieure Ă  arg , si c’est plus pratique pour l’implĂ©mentation (dans l’implĂ©mentation actuelle, l’affectation se fait sur le prochain multiple de la taille de la page supĂ©rieur Ă  la puissance de deux de la taille indiquĂ©e). La capacitĂ© actuelle (en octets) dĂ©finie est renvoyĂ©e en tant que rĂ©sultat de la fonction.

Essayer de dĂ©finir une capacitĂ© de tube plus petite que la taille de l’espace du tampon actuellement utilisĂ© pour stocker des donnĂ©es aboutit Ă  l’erreur EBUSY .

Remarquez qu’à cause de la maniĂšre dont les pages du tampon du tube sont utilisĂ©es quand des donnĂ©es sont Ă©crites dans le tube, le nombre d’octets qui peuvent ĂȘtre Ă©crits peut ĂȘtre infĂ©rieur Ă  la taille nominale, selon la taille des Ă©critures.

F_GETPIPE_SZ ( void ; depuis Linux 2.6.35)

Renvoyer (comme résultat de la fonction) la capacité du tube référencé par fd .

Verrouillages de fichier

Les verrous de fichier limitent le jeu d’opĂ©rations autorisĂ©es sur un fichier donnĂ©. Pour chaque verrou positionnĂ© sur un fichier, un ensemble spĂ©cifique d’opĂ©rations Ă©chouera sur le fichier avec EPERM Ă  partir de maintenant. Le fichier est dit verrouillĂ© (sealed). Le jeu de verrous dĂ©pend du type de fichier et du systĂšme de fichiers sous-jacents. Pour un aperçu du verrouillage de fichiers, un point sur ses objectifs et des exemples de code, voir memfd_create (2).

Actuellement, les verrous de fichier ne peuvent ĂȘtre appliquĂ©s que sur un descripteur de fichier renvoyĂ© par memfd_create (2) (si MFD_ALLOW_SEALING est utilisĂ©). Sur d’autres systĂšmes de fichiers, toutes les opĂ©rations de fcntl () agissant sur les verrous renverront EINVAL .

Les verrous constituent une propriĂ©tĂ© d’un inƓud. Ainsi, tous les descripteurs de fichier ouverts qui se rapportent au mĂȘme inƓud partagent le mĂȘme jeu de verrous. En outre, les verrous ne peuvent jamais ĂȘtre supprimĂ©s mais uniquement ajoutĂ©s.
F_ADD_SEALS
( int ; depuis Linux 3.17)

Ajouter les verrous donnĂ©s dans le paramĂštre arg du masque de bit Ă  l’ensemble de verrous de l’inƓud auquel se rapporte le descripteur de fichier fd . Les verrous ne peuvent pas ĂȘtre supprimĂ©s de nouveau. Une fois que cet appel rĂ©ussit, ils sont renforcĂ©s immĂ©diatement par le noyau. Si le jeu de verrous actuel comprend F_SEAL_SEAL (voir ci-dessous), cet appel sera rejetĂ© avec EPERM . L’ajout d’un verrou dĂ©jĂ  dĂ©fini n’est pas opĂ©rationnel, si F_SEAL_SEAL n’est pas dĂ©jĂ  positionnĂ©. Pour positionner un verrou, le descripteur de fichier fd doit ĂȘtre accessible en Ă©criture.

F_GET_SEALS ( void ; depuis Linux 3.17)

Renvoyer (en tant que rĂ©sultat de la fonction) le jeu de verrous actuel de l’inƓud auquel se rapporte fd . Si aucun verrou n’est positionnĂ©, 0 est renvoyĂ©. Si le fichier ne gĂšre pas les verrous, -1 est renvoyĂ© et errno est positionnĂ© sur EINVAL .

Les verrous suivants sont disponibles :
F_SEAL_SEAL

Si ce verrou est positionnĂ©, tout appel suivant Ă  fcntl () avec F_ADD_SEALS Ă©chouera avec l’erreur EPERM . Ce verrou empĂȘche donc toute modification du jeu de verrous lui-mĂȘme. Si le jeu de verrous initial du fichier comprend F_SEAL_SEAL , cela le rend en fait constant et verrouillĂ©.

F_SEAL_SHRINK

Si ce verrou est positionné, le fichier en question ne peut pas voir sa taille réduite. Cela concerne open (2) avec le drapeau O_TRUNC ainsi que truncate (2) et ftruncate (2). Ces appels échouent avec EPERM si vous essayez de réduire le fichier en question. Augmenter la taille reste possible.

F_SEAL_GROW

Si ce verrou est positionné, le fichier en question ne peut pas voir sa taille augmentée. Cela concerne write (2) aprÚs la fin du fichier, truncate (2), ftruncate (2) et fallocate (2). Ces appels échoueront avec EPERM si vous les utilisez pour augmenter la taille du fichier. Si vous la laissez stable ou la réduisez, ces appels fonctionneront comme prévu.

F_SEAL_WRITE

Si ce verrou est positionnĂ©, vous ne pouvez pas modifier le contenu du fichier. Remarquez que la rĂ©duction ou l’augmentation de la taille du fichier restent possibles et autorisĂ©es. Ainsi, ce verrou s’utilise en principe avec un autre verrou. Il concerne write (2) et fallocate (2) (combinĂ© au drapeau FALLOC_FL_PUNCH_HOLE ). Ces appels Ă©choueront avec EPERM si ce verrou est positionnĂ©. De plus, les tentatives de crĂ©er de nouveaux tableaux de mĂ©moire (memory-mappings) accessibles en Ă©criture avec mmap (2) Ă©choueront Ă©galement avec EPERM .

L’utilisation de l’opĂ©ration F_ADD_SEALS pour dĂ©finir le verrou F_SEAL_WRITE Ă©choue avec EBUSY si un tableau partagĂ© accessible en Ă©criture existe. De tels tableaux doivent ĂȘtre dĂ©sassociĂ©s avant d’ajouter ce verrou. De plus, s’il existe des opĂ©rations d’E/S asynchrones ( io_submit (2)) en attente sur le fichier, toutes les Ă©critures postĂ©rieures seront ignorĂ©es.

F_SEAL_FUTURE_WRITE (depuis Linux 5.1)

L’effet de ce verrou est identique Ă  F_SEAL_WRITE , mais le contenu du fichier peut encore ĂȘtre modifiĂ© avec des tableaux partagĂ©s accessibles en Ă©criture créés avant que le verrou ne soit positionnĂ©. Toute tentative de crĂ©er de nouveaux tableaux accessibles en Ă©criture sur le fichier avec mmap (2) Ă©chouera avec EPERM . De mĂȘme, une tentative d’écriture dans le fichier avec write (2) Ă©chouera avec EPERM .

En utilisant ce verrou, un processus peut crĂ©er un tampon de mĂ©moire qu’il peut continuer Ă  modifier tout en le partageant sur une base de « lecture seule » avec d’autres processus.

Indications de lecture/écriture de fichiers

Les indications (hints) de durĂ©e d’écriture peuvent ĂȘtre utilisĂ©es pour informer le noyau de la durĂ©e relative prĂ©vue des Ă©critures sur un inƓud ou Ă  l’aide d’une description de fichier ouvert en particulier (voir open (2) pour une explication sur les descriptions de fichier ouvert). Dans ce contexte, le terme « durĂ©e d’écriture » (write lifetime) signifie la durĂ©e prĂ©vue de vie des donnĂ©es sur le mĂ©dia avant d’ĂȘtre remplacĂ©es ou Ă©crasĂ©es.

Une application peut utiliser les diffĂ©rentes valeurs de rĂ©fĂ©rence indiquĂ©es ci-dessous pour sĂ©parer les Ă©critures en diffĂ©rentes classes, pour que plusieurs utilisateurs ou applications fonctionnant sur un seul dorsal de stockage puissent agrĂ©ger leurs motifs E/S de maniĂšre cohĂ©rente. Cependant, il n’existe pas de sĂ©mantique fonctionnelle impliquĂ©e par ces attributs et plusieurs classes E/S peuvent utiliser les valeurs de rĂ©fĂ©rence de durĂ©e d’écriture de maniĂšre arbitraire, tant que celles-ci sont utilisĂ©es de maniĂšre cohĂ©rente.

Les opĂ©rations suivantes peuvent ĂȘtre appliquĂ©es au descripteur de fichier, fd :
F_GET_RW_HINT
( uint64_t * ; depuis Linux 4.13)

Renvoie la valeur de rĂ©fĂ©rence (« hint ») de lecture/Ă©criture associĂ©e Ă  l’inƓud sous-jacent auquel renvoie fd .

F_SET_RW_HINT ( uint64_t * ; depuis Linux 4.13)

DĂ©finit la valeur de rĂ©fĂ©rence de lecture/Ă©criture associĂ©e Ă  l’inƓud sous-jacent auquel renvoie fd . Cette valeur de rĂ©fĂ©rence persiste soit jusqu’à ĂȘtre explicitement modifiĂ©e, soit jusqu’à ce que le systĂšme de fichiers sous-jacent ne soit dĂ©montĂ©.

F_GET_FILE_RW_HINT ( uint64_t * ; depuis Linux 4.13)

Renvoie la valeur de référence « hint » de lecture/écriture associée à la description de fichier ouvert à laquelle renvoie fd .

F_SET_FILE_RW_HINT ( uint64_t * ; depuis Linux 4.13)

Définit la valeur de référence de lecture/écriture associée à la description de fichier ouvert à laquelle se rapporte fd .

Si une description de fichier ouvert n’a pas de valeur de rĂ©fĂ©rence de lecture/Ă©criture assignĂ©e, elle devra utiliser la valeur affectĂ©e Ă  l’inƓud s’il y en a une.

Les valeurs de référence de lecture/écriture suivantes sont applicables depuis Linux 4.13 :
RWH_WRITE_LIFE_NOT_SET

Aucune valeur de rĂ©fĂ©rence en particulier n’a Ă©tĂ© dĂ©finie. Il s’agit de la valeur par dĂ©faut.

RWH_WRITE_LIFE_NONE

Aucune durĂ©e de vie spĂ©cifique Ă  l’écriture n’a Ă©tĂ© associĂ©e Ă  ce fichier ou Ă  cet inƓud.

RWH_WRITE_LIFE_SHORT

Les donnĂ©es Ă©crites dans cet inƓud ou via cette description de fichier ouvert doivent avoir une durĂ©e de vie courte.

RWH_WRITE_LIFE_MEDIUM

Les donnĂ©es Ă©crites dans cet inƓud ou via cette description de fichier ouvert doivent avoir une durĂ©e de vie supĂ©rieure Ă  celle des donnĂ©es Ă©crites avec RWH_WRITE_LIFE_SHORT .

RWH_WRITE_LIFE_LONG

Les donnĂ©es Ă©crites dans cet inƓud ou via cette description de fichier ouvert doivent avoir une durĂ©e de vie supĂ©rieure Ă  celle des donnĂ©es Ă©crites avec RWH_WRITE_LIFE_MEDIUM .

RWH_WRITE_LIFE_EXTREME

Les donnĂ©es Ă©crites dans cet inƓud ou via cette description de fichier ouvert doivent avoir une durĂ©e de vie supĂ©rieure Ă  celle des donnĂ©es Ă©crites avec RWH_WRITE_LIFE_LONG .

Toutes les valeurs de rĂ©fĂ©rence spĂ©cifiques Ă  l’écriture sont relatives entre elles et aucun sens absolu individuel ne devrait leur ĂȘtre attribuĂ©.

VALEUR RENVOYÉE

Pour qu’un appel rĂ©ussisse, le code de retour dĂ©pend de l’opĂ©ration :
F_DUPFD

Le nouveau descripteur de fichier.

F_GETFD

Valeur des attributs du descripteur de fichier.

F_GETFL

Valeur des attributs d’état du fichier.

F_GETLEASE

Le type de bail tenu sur le descripteur de fichier.

F_GETOWN

Valeur du propriétaire du descripteur de fichier.

F_GETSIG

La valeur du signal envoyĂ© lorsque la lecture ou l’écriture deviennent possibles, ou zĂ©ro pour le comportement SIGIO traditionnel.

F_GETPIPE_SZ
F_SETPIPE_SZ

La capacité du tube.

F_GET_SEALS

Un masque de bit identifiant les verrous positionnĂ©s sur le inƓud auquel renvoie fd .

Toutes les autres opérations :

Zéro.

En cas d’erreur, la valeur de retour est -1 et errno est dĂ©finie pour prĂ©ciser l’erreur.

ERREURS

EACCES ou EAGAIN

L’opĂ©ration est interdite en raison de verrous tenus par d’autres processus.

EAGAIN

L’opĂ©ration est impossible Ă  cause d’une projection en mĂ©moire effectuĂ©e par un autre processus.

EBADF

fd n’est pas un descripteur de fichier ouvert

EBADF

op vaut F_SETLK ou F_SETLKW et les droits d’ouverture sur le descripteur de fichier ne correspondent pas au type de verrou demandĂ©.

EBUSY

op vaut F_SETPIPE_SZ et la capacitĂ© du nouveau tube indiquĂ© dans arg est infĂ©rieure Ă  la taille de l’espace du tampon actuellement utilisĂ© pour stocker les donnĂ©es dans le tube.

EBUSY

op vaut F_ADD_SEALS , arg inclut F_SEAL_WRITE et il existe un tableau partagé accessible en écriture sur le fichier auquel se rapporte fd .

EDEADLK

Il a Ă©tĂ© dĂ©tectĂ© que l’opĂ©ration F_SETLKW spĂ©cifiĂ©e conduirait Ă  un interblocage.

EFAULT

lock se trouve en dehors de l’espace d’adressage.

EINTR

op vaut F_SETLKW ou F_OFD_SETLKW et l’opĂ©ration a Ă©tĂ© interrompue par un signal ; voir signal (7).

EINTR

op vaut F_GETLK , F_SETLK , F_OFD_GETLK ou F_OFD_SETLK et l’opĂ©ration a Ă©tĂ© interrompue par un signal avant la vĂ©rification ou l’acquisition du verrouillage. GĂ©nĂ©ralement, quand on verrouille un fichier distant (comme un verrou sur NFS), mais cela peut aussi arriver localement.

EINVAL

La valeur indiquĂ©e dans op n’est pas reconnue par ce noyau.

EINVAL

op vaut F_ADD_SEALS et arg inclut un bit de verrou non reconnu.

EINVAL

op vaut F_ADD_SEALS ou F_GET_SEALS et le systùme de fichiers contenant l’inƓud auquel se rapporte fd ne prend pas en charge les verrous.

EINVAL

op vaut F_DUPFD et arg est négatif ou supérieur à la valeur maximale permise (voir le point sur RLIMIT_NOFILE dans getrlimit (2)).

EINVAL

op vaut F_SETSIG et arg n’est pas un numĂ©ro de signal autorisĂ©.

EINVAL

op est F_OFD_SETLK , F_OFD_SETLKW ou F_OFD_GETLK , et l_pid n’a pas Ă©tĂ© dĂ©fini comme zĂ©ro.

EMFILE

op vaut F_DUPFD et la limite par processus du nombre de descripteurs de fichier ouverts a été atteinte.

ENOLCK

Trop de verrous sont ouverts, ou la table des verrous est pleine, ou le verrouillage distant (par exemple par NFS) a échoué.

ENOTDIR

F_NOTIFY a été indiqué dans op , mais fd ne fait pas référence à un répertoire.

EPERM

op vaut F_SETPIPE_SZ et la limite rigide ou souple du tube de l’utilisateur a Ă©tĂ© atteinte ; voir pipe (7).

EPERM

Essai d’effacement de l’attribut O_APPEND sur un fichier, mais il est considĂ©rĂ© comme en-ajout-seulement.

EPERM

op valait F_ADD_SEALS , mais fd n’était pas ouvert en Ă©criture ou le jeu de verrous actuel sur le fichier inclut dĂ©jĂ  F_SEAL_SEAL .

STANDARDS

POSIX.1-2008.

F_GETOWN_EX , F_SETOWN_EX , F_SETPIPE_SZ , F_GETPIPE_SZ , F_GETSIG , F_SETSIG , F_NOTIFY , F_GETLEASE et F_SETLEASE sont spécifiques à Linux. (Définissez la macro _GNU_SOURCE pour avoir ces définitions).

F_OFD_SETLK , F_OFD_SETLKW et F_OFD_GETLK sont spécifiques à Linux (et il faut définir _GNU_SOURCE pour obtenir leurs définitions), mais le travail est en cours pour les avoir dans la prochaine version de POSIX.1.

F_ADD_SEALS et F_GET_SEALS sont spécifiques à Linux.

HISTORIQUE

SVr4, 4.3BSD, POSIX.1-2001.

Seules les opérations F_DUPFD , F_GETFD , F_SETFD , F_GETFL , F_SETFL , F_GETLK , F_SETLK et F_SETLKW sont spécifiées dans POSIX.1-2001.

F_GETOWN et F_SETOWN sont spécifiées dans POSIX.1-2001 (pour activer ces définitions, vous devez définir soit _XOPEN_SOURCE à la valeur supérieure ou égale à 500, soit _POSIX_C_SOURCE à la valeur supérieure ou égale à 200809L).

F_DUPFD_CLOEXEC est spécifiée dans POSIX.1-2008 (pour activer cette définition, vous devez définir _POSIX_C_SOURCE avec une valeur supérieure ou égale à 200809L, ou _XOPEN_SOURCE avec une valeur supérieure ou égale à 700).

NOTES

Les erreurs renvoyĂ©es par dup2 (2) ne sont pas les mĂȘmes que celles renvoyĂ©es par F_DUPFD .

Verrouillages de fichier

L’appel systĂšme fcntl () originel de Linux n’a pas Ă©tĂ© conçu pour gĂ©rer les positions (dans la structure flock ) dans des fichiers de trĂšs grosse taille. En consĂ©quence, Linux 2.4 a ajoutĂ© l’appel systĂšme fcntl64 (). Ce nouvel appel systĂšme utilise une structure diffĂ©rente de verrouillage de fichier, flock64 , ainsi que les opĂ©rations correspondantes F_GETLK64 , F_SETLK64 et F_SETLKW64 . Cependant, ces dĂ©tails peuvent ĂȘtre ignorĂ©s par les applications qui utilisent la glibc, car sa fonction fcntl () encapsule de maniĂšre transparente l’appel systĂšme le plus rĂ©cent disponible.

Verrouillages d’enregistrements

Depuis Linux 2.0, il n’y a pas d’interaction entre les types de verrous placĂ©s par flock (2) et fcntl ().

Plusieurs systĂšmes ont d’autres champs dans struct flock comme, par exemple, l_sysid (pour identifier la machine oĂč se trouve le verrou). Clairement, l_pid seul ne sera pas trĂšs utile si le processus dĂ©tenant le verrou s’exĂ©cute sur une autre machine ; sur Linux, bien que ce champ soit prĂ©sent sur certaines architectures (comme MIPS32), ce champ n’est pas utilisĂ©.

L’appel systĂšme fcntl () originel de Linux n’a pas Ă©tĂ© conçu pour gĂ©rer les positions (dans la structure flock ) dans des fichiers de trĂšs grosse taille. En consĂ©quence, Linux 2.4 a ajoutĂ© l’appel systĂšme fcntl64 (). Ce nouvel appel systĂšme utilise une structure diffĂ©rente de verrouillage de fichier, flock64 , ainsi que les opĂ©rations correspondantes F_GETLK64 , F_SETLK64 et F_SETLKW64 . Cependant, ces dĂ©tails peuvent ĂȘtre ignorĂ©s par les applications qui utilisent la glibc, car sa fonction fcntl () encapsule de maniĂšre transparente l’appel systĂšme le plus rĂ©cent disponible.

Verrouillages d’enregistrements et NFS

Avant Linux 3.12, si un client NFSv4 perd le contact avec le serveur pendant un certain temps (dĂ©fini Ă  plus de 90 secondes sans communication), il pourrait perdre puis obtenir un nouveau verrou sans mĂȘme en ĂȘtre informĂ©. (La pĂ©riode au bout de laquelle le contact est assumĂ© perdu est connue sous le nom de pĂ©riode de bail (« leasetime ») NFSv4. Sur un serveur NFS Linux, elle peut ĂȘtre dĂ©terminĂ©e en regardant /proc/fs/nfsd/nfsv4leasetime , qui exprime la pĂ©riode en seconde. La valeur par dĂ©faut pour ce fichier est 90.) Ce scĂ©nario a pour risque potentiel la corruption de donnĂ©es, puisqu’un autre processus pourrait obtenir un verrou pendant la pĂ©riode intermĂ©diaire et rĂ©aliser des entrĂ©es et sorties de fichier.

Depuis Linux 3.12, si un client NFSv4 perd le contact avec le serveur, toutes les entrĂ©es et sorties du fichier par un processus qui « pense » dĂ©tenir un verrou Ă©choueront avant que le processus ne ferme et rouvre le fichier. Un paramĂštre du noyau, nfs.recover_lost_locks , peut ĂȘtre dĂ©fini Ă  1 pour obtenir le comportement prĂ©cĂ©dant (avant Linux 3.12), oĂč le client essayera de rĂ©cupĂ©rer les verrous perdus quand le contact avec le serveur est rĂ©tabli. À cause du risque associĂ© de corruption de donnĂ©es, la valeur par dĂ©faut de ce paramĂštre est 0 (dĂ©sactivĂ©).

BOGUES

F_SETFL

Il n’est pas possible d’utiliser F_SETFL pour modifier l’état des attributs O_DSYNC et O_SYNC . Une tentative de modification de ces attributs sera simplement ignorĂ©e.

F_GETOWN

En raison d’une limitation des conventions d’appels systĂšme sur certaines architectures (en particulier i386), si F_GETOWN renvoie un identifiant de groupe de processus compris entre -1 et -4095, la valeur de retour est interprĂ©tĂ©e par glibc comme une erreur ; la valeur de retour de fcntl () sera -1 et errno contiendra l’identifiant du groupe de processus (positif). L’opĂ©ration spĂ©cifique Ă  Linux F_SETOWN_EX Ă©vite ce problĂšme. Depuis la glibc 2.11, glibc rend le problĂšme avec F_GETOWN invisible en implĂ©mentant F_GETOWN par-dessus F_GETOWN_EX .

F_SETOWN

Sous Linux 2.4 et prĂ©cĂ©dents, lorsqu’un processus non privilĂ©giĂ© utilise F_SETOWN pour indiquer le propriĂ©taire d’un socket, avec un identifiant de (groupe de) processus autre que celui de l’appelant, un bogue peut survenir. Dans ce cas, fcntl () peut renvoyer -1 , avec errno positionnĂ© Ă  EPERM , mĂȘme si l’appelant a le droit d’envoyer un signal Ă  ce (groupe de) processus. En dĂ©pit de cette erreur, le propriĂ©taire du descripteur de fichier est positionnĂ©, et les signaux seront envoyĂ©s au propriĂ©taire.

DĂ©tection d’interblocage

L’algorithme de dĂ©tection d’interblocage utilisĂ© par le noyau lors du traitement de demandes F_SETLKW peut produire Ă  la fois des faux nĂ©gatifs (Ă©chec de dĂ©tection d’interblocages, laissant un ensemble de processus interbloquĂ©s se bloquer indĂ©finiment) et des faux positifs (erreurs EDEADLK alors qu’aucun interblocage n’existe). Par exemple, le noyau limite la profondeur de verrouillage lors de sa recherche de dĂ©pendances Ă  dix Ă©tapes, ce qui signifie que les chaĂźnes d’interblocages circulaires dĂ©passant cette taille ne seront pas dĂ©tectĂ©es. De plus, le noyau pourrait faussement indiquer un interblocage lorsqu’au moins deux processus créés en utilisant l’attribut CLONE_FILES de clone (2) placent des verrous qui semblent (au noyau) en conflit.

Verrouillage impératif

L’implĂ©mentation Linux du verrouillage impĂ©ratif est sujette Ă  des conditions de concurrence qui la rende non fiable : un appel Ă  write (2) qui chevauche un verrou peut modifier les donnĂ©es aprĂšs que le verrouillage impĂ©ratif a Ă©tĂ© acquis ; un appel Ă  read (2) qui chevauche un verrou peut dĂ©tecter des modifications sur des donnĂ©es qui ont Ă©tĂ© faites seulement aprĂšs qu’un verrou en Ă©criture a Ă©tĂ© acquis. Des conditions de concurrence similaires existent entre les verrous impĂ©ratifs et mmap (2). Il est donc dĂ©conseillĂ© de faire confiance au verrouillage impĂ©ratif.

VOIR AUSSI

dup2 (2), flock (2), open (2), socket (2), lockf (3), capabilities (7), feature_test_macros (7), lslocks (8)

locks.txt , mandatory-locking.txt et dnotify.txt dans le rĂ©pertoire Documentation/filesystems/ des sources du noyau Linux. (Sur d’anciens noyaux, ces fichiers se trouvent dans le rĂ©pertoire Documentation/ et mandatory-locking.txt est appelĂ© mandatory.txt .)

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> et Jean-Philippe MENGUAL <jpmengual@debian.org>

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 .