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

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> ».
Linux 20 avril 2014 FCNTL(2)