table of contents
other sections
FCNTL(2) | Manuel du programmeur Linux | FCNTL(2) |
NOM¶
fcntl - Manipuler un descripteur de fichierSYNOPSIS¶
#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.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é. Spécifier 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.
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.- 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.
Verrouillages coopératifs¶
F_GETLK, F_SETLK et F_SETLKW 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 spécifié).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.
- 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.
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.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 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 :
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.
struct f_owner_ex { int type; pid_t pid; };
- 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 spécifie 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.
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.
- 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é.
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).
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.
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 via 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.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.BOGUES¶
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.VOIR AUSSI¶
dup2(2), flock(2), open(2), socket(2), lockf(3), capabilities(7), feature_test_macros(7)COLOPHON¶
Cette page fait partie de la publication 3.44 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> ».15 avril 2012 | Linux |