bionic (2) fcntl.2.gz

Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       fcntl - Manipuler un descripteur de fichier

SYNOPSIS

       #include <unistd.h>
       #include <fcntl.h>

       int fcntl(int fd, int cmd, ... /* 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 cmd.

       fcntl() prend un troisième paramètre optionnel. La nécessité de fournir ce paramètre dépend  de  cmd.  le
       paramètre  doit  être du type indiqué entre parenthèses après chaque nom de commande cmd (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.

   Dupliquer un descripteur de fichier
       F_DUPFD (int)
              Trouver  le  plus  petit  numéro de descripteur libre supérieur ou égal à arg et le transformer en
              copie de fd. Ceci est différent de dup2(2), qui utilise exactement le descripteur transmis.

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

              Consultez dup(2) pour plus d'informations.

       F_DUPFD_CLOEXEC (int ; depuis Linux 2.6.24)
              Comme pour F_DUPFD, mais positionne en  plus  l'attribut  « close-on-exec »  pour  le  descripteur
              dupliqué.  Indiquer  cet  attribut permet 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  commandes  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 0, le descripteur de fichier reste ouvert au travers d'un execve(2), autrement il sera fermé.

       F_GETFD (void)
              Lire 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 fuite du descripteur de
       fichier vers le programme exécuté dans le processus fils. 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, initialisés par open(2) et éventuellement
       modifiés par fcntl(). Les attributs sont partagés entre les copies (obtenues avec dup(2), fcntl(F_DUPFD),
       fork(2), etc.) du même descripteur de fichier.

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

       F_GETFL (void)
              Obtenir le mode d'accès et les attributs d'état du fichier ; arg est ignoré.

       F_SETFL (int)
              Positionner  les  nouveaux  attributs pour le descripteur de fichier à la valeur indiquée par arg.
              Les bits de mode d'accès (O_RDONLY, O_WRONLY, O_RDWR)  et  les  attributs  de  création  (O_CREAT,
              O_EXCL,  O_NOCTTY,  O_TRUNC)  de  arg sont ignorés. Sous Linux, cette commande ne peut changer que
              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 coopératifs
       F_SETLK,  F_SETLKW  et  F_GETLK  servent  à  gérer les verrouillages d'enregistrements (de segments ou de
       régions 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
                                   (F_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é,  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 la 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. Ceci est supporté par Linux depuis les versions 2.4.21 et 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  région
       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  région d'un fichier, si un nouveau verrou y est appliqué, alors le verrou précédent est
       converti suivant le nouveau type. Ceci peut 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.

       F_SETLKW (struct flock *)
              Comme F_SETLK, mais attend la libération du verrou au lieu de retourner une erreur. Si un signal à
              intercepter  est  reçu  pendant l'attente, l'appel est interrompu et renverra immédiatement (après
              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 et remplit l_pid avec le PID du
              processus tenant le verrou. Notez  que  l'information  renvoyée  par  F_GETLK  peut  être  devenue
              obsolète au moment où l'appelant l'examine.

       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.

       Outre  la  suppression  par  un  F_UNLCK  explicite,  les verrous sont automatiquement libérés lorsque le
       processus se termine, ou s'il ferme l'un des descripteurs se référant au fichier sur lequel le verrou est
       placé.  C'est  dangereux :  cela  signifie  qu'un  processus  peut  perdre un verrou sur un fichier comme
       /etc/passwd ou /etc/mtab si, pour une raison quelconque, une fonction de bibliothèque décide de  l'ouvrir
       puis de le refermer.

       Les  verrouillages  d'enregistrements  ne  sont  pas hérités par les enfants lors d'un fork(2), mais sont
       conservés au travers 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é. Utilisez plutôt read(2) et write(2).

   Verrouillage obligatoire
       (Non  POSIX)  Les  verrous d'enregistrements décrits ci‐dessus peuvent être coopératifs ou impératifs, et
       sont coopératifs par défaut.

       Les verrouillages coopératifs ne sont pas imposés, donc ils ne fonctionnent qu'entre  processus  qui  les
       utilisent.

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

       L'implémentation  Linux  des  verrouillages  obligatoires  n'est  pas fiable. Consultez la section BOGUES
       ci-dessous.

   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 du groupe de processus qui reçoit les
              signaux SIGIO et SIGURG pour les événements concernant le descripteur de fichier fd.  Les  groupes
              de  processus  sont  renvoyés  sous  forme  de  valeurs négatives (consultez la section BOGUES ci‐
              dessous). arg est ignoré.

       F_SETOWN (int)
              Définir le PID ou l'identifiant du groupe de processus qui recevront les signaux SIGIO  et  SIGURG
              pour  les  événements concernant le descripteur fd, à l'identifiant fourni par arg. Les groupes de
              processus sont formulés en tant que valeurs négatives. En général, le processus  appelant  indique
              son propre PID comme argument (arg est donc getpid(2)).

              Si  vous  définissez  l'attribut  O_ASYNC  sur  un descripteur de fichier en utilisant la commande
              F_SETFL de fcntl(), un signal SIGIO est envoyé dès que l'entrée ou la sortie sont possibles sur ce
              descripteur.  F_SETSIG  peut  être  utilisé  pour  recevoir  un  autre  signal  que  SIGIO.  Si la
              vérification de permissions échoue, le signal est ignoré silencieusement.

              L'envoi d'un signal au processus (ou groupe de processus) 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 (consultez la  section  BOGUES  ci‐dessous).  Si
              cette vérification échoue, le signal est ignoré.

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

              Le paragraphe ci-dessous était valide pour les noyaux 2.6.x, jusqu'au 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 une 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érieure 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 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 du descripteur en  attente,  et  il  faut  utiliser  le  mécanisme
              habituel  (select(2),  poll(2),  read(2)  avec  O_NONBLOCK  configuré  etc.) pour déterminer quels
              descripteurs sont disponibles pour les entrées-sorties.

              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.

              Noter  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.
       Ceci 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 ») essaye d'appeler open(2) ou truncate(2) sur le fichier pointé par ce descripteur de
       fichier

       F_SETLEASE (int)
              Définit ou supprime 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éé par, par exemple, fork(2) ou dup(2)) font référence au même bail,
       et  que  ce  bail peut être modifié ou relâché par n'importe lequel de ces descripteurs. De plus, le bail
       est relâché 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)
              Indique 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 la
       commande 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 la  commande  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 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 force à 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  la
       commande  F_SETSIG de la fonction fcntl(). Si une commande 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. (Ceci 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) Fournit 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, pread, readv)
              DN_MODIFY   Modification d'un fichier (write, pwrite, truncate, ftruncate).
              DN_CREATE   Création d'un fichier (open, creat, mknod, mkdir, link, symlink, rename).
              DN_DELETE   Suppression d'un fichier (unlink, renommage dans un autre répertoire, rmdir).
              DN_RENAME   Un fichier a été renommé dans le même répertoire (nerame).
              DN_ATTRIB   Les attributs d'un fichier ont été modifiés (chown, chmod, utime[s]).

              (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  la  commande  F_SETSIG de fcntl(). 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.

              NOTE :  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)
              Change  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. Quand il alloue le tampon pour le tube, le
              noyau  peut  utiliser  une  capacité  supérieure  à  arg,  si  cela   est   plus   pratique   pour
              l'implémentation.  L'opération  F_GETPIPE_SZ renvoie la taille réellement utilisée. Les tentatives
              pour définir la capacité du tube en dessous de la capacité du  tampon  actuellement  utilisé  pour
              sauvegarder les données produit l'erreur EBUSY.

       F_GETPIPE_SZ (void ; depuis Linux 2.6.35)
              Renvoie (comme résultat de la fonction) la capacité du tube référencé par fd.

VALEUR RENVOYÉE

       La valeur renvoyée par fcntl() varie suivant le type d'opération :

       F_DUPFD  Le nouveau descripteur.

       F_GETFD  Valeur des attributs du descripteur de fichier.

       F_GETFL  Valeur des attributs d'état du fichier.

       F_GETLEASE
                Le type bail tenu sur le descripteur de fichier.

       F_GETOWN Le 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
                La capacité du tube.

       Toutes les autres commandes :
                Zéro.

       En cas d'erreur, la valeur de retour est -1, et errno contient le code d'erreur.

ERREURS

       EACCES ou EAGAIN
              L'opération est interdire 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, ou la commande était F_SETLK ou F_SETLKW et le mode
              d'ouverture du descripteur de fichier ne correspond pas au type de verrou demandé.

       EDEADLK
              Le verrouillage F_SETLKW conduirait à un blocage.

       EFAULT lock se trouve en dehors de l'espace d'adressage.

       EINTR  Pour  F_SETLKW, la commande a été interrompue par un signal ; consultez signal(7). Pour F_GETLK et
              F_SETLK, la commande a été interrompue par un signal avant la  vérification  ou  l'acquisition  du
              verrou.  Se  produit surtout lors d'un verrouillage distant (par exemple à travers NFS), mais peut
              également arriver localement.

       EINVAL Pour F_DUPFD, arg est soit négatif, soit trop grand. Pour F_SETSIG, arg n'est  pas  un  numéro  de
              signal correct.

       EMFILE Pour F_DUPFD, le processus a déjà ouvert le nombre maximal de descripteurs de fichier.

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

       EPERM  Essai  d'effacement  de  l'attribut  O_APPEND  sur  un  fichier,  mais  il  est  considéré   comme
              en-ajout-seulement.

CONFORMITÉ

       SVr4,  BSD 4.3, 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
       _BSD_SOURCE,  ou  _XOPEN_SOURCE  avec  une  valeur supérieure ou égale à 500, ou _POSIX_C_SOURCE avec une
       valeur supérieure ou égale à 200809L.

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

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

NOTES

       L'appel système fcntl() original 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  commandes  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.

       Les erreurs renvoyées par dup2(2) ne sont pas les mêmes que celles renvoyées par F_DUPFD.

       Depuis le noyau 2.0, il n'y a pas d'interaction entre les verrous placés par flock(2) et ceux de fcntl().

       Plusieurs  systèmes  ont d'autres champs dans struct flock comme, par exemple, l_sysid. Clairement, l_pid
       seul ne sera pas très utile si le processus tenant le verrou s'exécute sur une autre machine.

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). Les opérations spécifiques à Linux F_SETOWN_EX
       et  F_GETOWN_EX évitent 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'une 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.

   Verrouillage obligatoire
       L'implémentation du verrouillage obligatoire dans toutes les versions connues de Linux est  sujet  à  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  obligatoire  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 obligatoires et mmap(2). Il est donc déconseillé de faire confiance au verrouillage obligatoire.

VOIR AUSSI

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

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

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions    pour    signaler    des    anomalies    peuvent     être     trouvées     à     l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe      Blaess      <http://www.blaess.fr/christophe/>      (1996-2003),       Alain       Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction de
       Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org>  ou  par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».