Provided by: manpages-fr-dev_4.26.0-1_all bug

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.

Pages du manuel de Linux 6.9.1                     2 mai 2024                                           fcntl(2)