FCNTL(2) Manuel du programmeur Linux FCNTL(2)
NOM
fcntl - Manipuler un descripteur de fichier.
SYNOPSIS
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock * lock);
DESCRIPTION
La fonction 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
:
F_DUPFD effectue une copie de fd, dans arg en fermant
d'abord arg si besoin est.
On peut effectuer la même chose plus aisément en
utilisant dup2(2).
Le nouveau descripteur et l'ancien peuvent être
utilises de manière interchangeable. Ils parta
gent le même verrou, le même position de tête de
lecture/écriture, et les mêmes attributs. Par
exemple si la tête de lecture/écriture est
déplacée en utilisant lseek sur l'un des deux
descripteurs, la position sera modifiée également
pour l'autre.
Les deux descripteurs ne partagent toutefois pas
l'attribut Close-on-exec. L'attribut
Close-on-exec de la copie est désactivé.
En cas de réussite, le nouveau descripteur est
renvoyé par la fonction fcntl.
F_GETFD retourne la valeur de l'attribut Close-on-exec.
Si le bit de poids faible est 0, le fichier
restera ouvert même au travers d'un exec,
autrement il sera fermé.
F_SETFD positionne l'attribut Close-on-Exec avec la
valeur precisée par arg (seul le bit de poids le
plus faible est utilisé).
F_GETFL retourne l'ensemble des attributs positionnés
lors de open(2) pour le descripteur de fichier.
F_SETFL fixe de nouveaux attributs pour le descripteur de
fichier fd. Les nouveaux attributs sont contenus
Linux 5 Mai 1999 1
FCNTL(2) Manuel du programmeur Linux FCNTL(2)
dans arg. Seuls O_APPEND, O_NONBLOCK et O_ASYNC
peuvent être modifiés ainsi, les autres attributs
ne sont pas affectés.
A noter, les attributs sont partagés entre les
différentes copies (faites avec dup(2) etc...)
d'un même descripteur de fichier.
Les attributs et leurs sémantiques sont décrits
dans la page de manuel de open(2).
F_GETLK, F_SETLK, et F_SETLKW
servent à gérer les verrouillages de fichiers.
Le troisième argument lock est un pointeur sur
une structure flock (qui peut être ecrasée par
l'appel)
F_GETLK renvoie la structure flock qui nous empêche
d'accéder au verrou, ou positionne le champ
l_type du verrou à la valeur F_UNLCK si c'est
possible.
F_SETLK active le verrou (si l_type vaut F_RDLCK ou
F_WRLCK) ou efface le verrou (si l_type vaut
F_UNLCK). Si le verrou est tenu par quelqu'un
d'autre, cet appel renvoie -1 et positionne errno
aux valeurs EACCES ou EAGAIN.
F_SETLKW Comme F_SETLK, mais attend la libération du ver
rou au lieu de retourner une erreur. Si un sig
nal à intercepter est reçu pendant que fcntl
attend, il est interrompu et renverra immédiate
ment (après retour du gestionnaire de signaux) la
valeur -1. errno sera remplie avec la valeur
EINTR.
F_GETOWN, F_SETOWN, F_GETSIG and F_SETSIG servent à gérer
la disponibilité des signaux d'entrée/sortie :
F_GETOWN
obtient 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 numéros de groupes de processus sont renvoyés
sous forme de valeurs négatives.
F_SETOWN
fixe le PID ou l'ID du groupe de processus qui
reçevront les signaux SIGIO et SIGURG pour les
évènements concernant le descripteur.
Les numéros de groupes de processus sont formulés
en tant que valeurs négatives. (F_SETSIG peut
servir à indiquer un autre signal que SIGIO).
Linux 5 Mai 1999 2
FCNTL(2) Manuel du programmeur Linux FCNTL(2)
Si vous fixez l'attribut O_ASYNC sur un descripteur
de fichiers (soit en utilisant ce drapeau lors de
l'appel à open(2), soit 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. Le processus, ou le groupe de proces
sus, susceptibles de recevoir le signal peut être
indiqué avec la commande F_SETOWN de la fonction
fcntl. Si le descripteur est une socket, ceci per
met également la réception de signaux SIGURG
lorsque des données hors-bande arrivent sur la
socket. (SIGURG est émis dans toutes les situation
où l'appel select(2) aurait indiqué que la socket
est dans une "situation exceptionnelle"). Si le
descripteur de fichier correspond à un terminal, le
signal SIGIO est envoyé au groupe de processus en
avant-plan sur ce terminal.
F_GETSIG
Demande l'émission d'un signal 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 à émettre, et des
informations supplémentaires seront disponibles
pour le gestionnaire de signaux s'il est installé à
l'aide de SA_SIGINFO.
F_SETSIG
Indique le signal à émettre lorsque l'entrée ou la
sortie deviennent possibles. Une valeur nulle sig
nifie 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 de signaux s'il est installé à
l'aide de SA_SIGINFO.
En utilisant F_SETDIG avec une valeur non-nulle, et
en configurant SA_SIGINFO pour le gestionnaire
(voir sigaction(2)), des informations supplémen
taires sur les évènements d'E/S sont fournies au
gestionnaire à traves 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'évenement. 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 dispnibles
pour les E/S.
En sélectionnant un signal temps réel POSIX.1b
(valeur >= SIGRTMIN), de multiples évènements d'E/S
peuvent être mémorisés avec le même numéro. (La
taille de la file d'évènement dépend de la mémoire
Linux 5 Mai 1999 3
FCNTL(2) Manuel du programmeur Linux FCNTL(2)
libre). Des informations supplémentaires sont
disponibles, comme ci-dessus, si SA_SIGINFO est
configuré pour le gestionnaire.
En utilisant ces mécanismes, un programme peut implémenter
des E/S totalement asynchrones, la plupart du temps sans
avoir besoin d'invoquer select(2) ou poll(2).
L'utilisation de O_ASYNC, F_GETOWN, est spécifique BSD et
Linux.
F_GETSIG et F_SETSIG sont spécifiques à Linux. POSIX dis
posent d'E/S 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).
VALEUR RENVOYÉE
La valeur renvoyée par fcntl varie suivant le type
d'opération :
F_DUPFD renvoie le nouveau descripteur.
F_GETFD renvoie l'état de l'attribut.
F_GETFL renvoie l'état des attributs.
F_GETOWN renvoie le propriétaire du fichier.
F_GETSIG Valeur du signal envoyé lorsque la lecture ou
l'écriture deviennent possibles, ou zéro pour le
comportement SIGIO traditionnel.
En cas d'échec -1 est renvoyé, auquel cas errno contient
le code d'erreur.
ERREURS
EACCESS L'opération est rendue impossible à cause d'un
verrou maintenu par un autre processus.
EAGAIN L'opération est rendue impossible à cause d'une
projection en mémoire effectuée par un autre pro
cessus.
EBADF fs n'est pas un descripteur de fichier ouvert.
EDEADLK Le verrouillage en écriture 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. Pour F_GETLK et F_SETLK, la commande
a été interrompue par uin signal avant la
Linux 5 Mai 1999 4
FCNTL(2) Manuel du programmeur Linux FCNTL(2)
vérification ou l'acquisition du verrou. Se pro
duit 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 nom
bre maximal de descripteurs de fichiers.
ENOLCK La table des verrous est pleine.
EPERM Essai d'effacement de l'attribut O_APPEND sur un
fichier, mais il est considéré comme en-ajout-
seulement.
NOTES
Les erreurs renvoyées par dup2 ne sont pas les mêmes que
celles renvoyées par fcntl avec la commande F_DUPFD.
CONFORMITÉ
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. 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. F_GETOWN
et F_SETOWN sont des BSDismes non supportés par SVr4.
F_GETSIG et F_SETSIG sont spécifiques à Linux. Les
attributs autorisés pour F_GETFL/F_SETFL sont ceux sup
portés par open(2) et peuvent être différents suivant les
systèmes. O_APPEND, O_NONBLOCK, O_RDONLY, et O_RDWR sont
spécifies par POSIX.1. SVr4 propose plusieurs autres
options et attributs non documentés ici.
SVr4 indique des erreurs EIO, ENOLINK et EOVERFLOW
supplémentaires.
VOIR AUSSI
dup2(2), open(2), socket(2), flock(2)
TRADUCTION
Christophe Blaess, 1997.
Linux 5 Mai 1999 5