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

DESCRIPTION
La fonction fcntl permet de se livrer a diverses operations sur le descripteur de fichier fd. L'operation en question est determinee 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 meme chose plus aisement en utilisant dup2(2).

    Le nouveau descripteur et l'ancien peuvent etre utilises de maniere interchangeable. Ils partagent le meme verrou, le meme position de tete de lecture/ecriture, et les memes attributs. Par exemple si la tete de lecture/ecriture est deplacee en utilisant lseek sur l'un des deux descripteurs, la position sera modifiee egalement pour l'autre.

    Les deux descripteurs ne partagent toutefois pas l'attribut Close-on-exec. L'attribut Close-on-exec de la copie est desactive.

    En cas de reussite, le nouveau descripteur est renvoye par la fonction fcntl.

F_GETFD
    retourne la valeur de l'attribut Close-on-exec. Si le bit de poid faible est 0, le fichier restera ouvert meme au travers d'un exec, autrement il sera ferme.

F_SETFD
    positionne l'attribut Close-on-Exec avec la valeur precisee par arg (seul le bit de poid le plus faible est utilise).

F_GETFL
    retourne l'ensemble des attributs positionnes 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 dans arg. Seuls O_APPEND et O_NONBLOCK peuvent etre modifies ainsi.

    A noter, les attributs sont partages entre les differentes copies (faites avec dup etc...) d'un meme descripteur de fichier.

    Les attributs et leurs semantiques sont decrits dans la page de manuel de open(2).

F_GETLK, F_SETLK, et F_SETLKW
    Gere les verrouillages de fichiers. Le troisieme argument arg est un pointeur sur une structure flock (qui peut etre ecrasee par l'appel)

F_GETLK
    renvoie la structure flock qui nous empeche d'acceder au verrou, ou positionne le champ l_type du verrou a 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 liberation du verrou au lieu de retourner une erreur.

F_GETOWN
    obtient le PID (ou l'ID du groupe de processus) du proprietaire d'une socket.

    Les numeros de groupes de processus sont renvoyes sous forme de valeur negative.

F_SETOWN
    etablit la possession en tant que processus ou groupe de processus d'une socket.

    Pour ces commandes, la notion de possession correspond a la reception les signaux SIGIO et SIGURG.

    Les numeros de groupes de processus sont formules en tant que valeurs negatives.

VALEUR RENVOYEE
La valeur renvoyee par fcntl varie suivant le type d'operation :

F_DUPFD
    renvoie le nouveau descripteur.

F_GETFD
    revoie l'etat de l'attribut.

F_GETFL
    renvoie l'etat des attributs.

F_GETOWN
    renvoie le proprietaire du fichier.

En cas d'echec -1 est retourne, auquel cas errno contient le code d'erreur.

ERREURS

EACCESS
    L'operation est rendue impossible a cause d'un verrou maintenu par un autre processus. EAGAIN L'operation est rendue impossible a cause d'une projection en memoire effectuee par un autre processus. EDEADLK Le verrouillage en ecriture conduirait a un blocage. EBADF fs n'est pas un descripteur de fichier ouvert.

EINVAL
    Pour F_DUPFD, arg est soit negatif, soit trop grand.

EMFILE
    Pour F_DUPFD, le processus a deja ouvert le nombre maximal de descripteurs de fichiers. ENOLCK La table des verrous est pleine.

NOTES
Les erreurs renvoyees par dup2 ne sont pas les memes que celles renvoyees par fcntl avec la commande F_DUPFD.

CONFORMITE
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Seules les operations F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK et F_SETLKW sont specifiees dans POSIX.1. F_GETOWN et F_SETOWN sont des BSDismes non supportes par SVr4. Les attributs autorises pour F_GETFL/F_SETFL sont ceux supportes par open(2) et peuvent etre differents suivant les systemes. O_APPEND, O_NONBLOCK, O_RDONLY, et O_RDWR snt specifies par POSIX.1. SVr4 propose plusieurs autres options et attributs non documentes ici.

POSIX.1 decrit une condition d'erreur EINTR supplementaire. SVr4 indique des erreurs EFAULT, EINTR, EIO, ENOLINK et EOVERFLOW supplementaires.

VOIR AUSSI
dup(2), flock(2), open(2), socket(2).