Sous-routine fcntl, dup ou dup2

Objectif

Contrôle les descripteurs de fichiers ouverts.

Bibliothèque

Bibliothèque C standard (libc.a)

Bibliothèque de compatibilité Berkeley (libbsd.a) (pour la sous-routine fcntl )

Syntaxe

#include <fcntl.h>

int fcntl ( FileDescriptor, Command, Argument) int FileDescriptor, Command, Argument;

#include <unistd.h>

Int dup2( Ancien, Nouveau) Int  Ancien, Nouveau;

int dup( FileDescriptor) int FileDescriptor;

Descriptif

La sous-routine fcntl effectue des opérations de contrôle sur le fichier ouvert spécifié par le paramètre FileDescriptor . Si Network File System (NFS) est installé sur votre système, le fichier ouvert peut résider sur un autre noeud. Le sous-programme Fcntl est utilisé pour:

  • Descripteurs de fichiers ouverts en double.
  • Définissez et obtenez les indicateurs de descripteur de fichier.
  • Définissez et obtenez les indicateurs de statut de fichier.
  • Gérez les verrous d'enregistrement.
  • Gestion de la propriété d'E-S asynchrone.
  • Fermez plusieurs fichiers.

La sous-routine Fcntl peut fournir les mêmes fonctions que les sous-routines Dup et dup2 .

Si FileDescriptor fait référence à une unité de terminal ou à un socket, des fonctions d'E-S asynchrones peuvent être utilisées. Ces fonctions sont normalement activées à l'aide du sous-programme Ioctl avec les commandes FIOASYNC, FIOSETOWNet FIOGETOWN . Toutefois, un mécanisme compatible BSD est également disponible si l'application est liée à la bibliothèque libbsd.a .

Lorsque le paramètre FileDescriptor fait référence à un objet de mémoire partagée, la sous-routine fcntl gère uniquement les commandes F_DUPFD, F_DUP2FD, F_GETFD, F_SETFD, F_GETFLet F_CLOSEM .

Lors de l'utilisation de la bibliothèque libbsd.a , les E-S asynchrones sont activées à l'aide de la commande F_SETFL avec l'indicateur FASYNC défini dans le paramètre Argument . Les commandes F_GETOWN et F_SETOWN obtiennent le propriétaire d'E-S asynchrone en cours et définissez le propriétaire d'E-S asynchrone. Toutefois, ces commandes ne sont valides que lorsque le descripteur de fichier fait référence à une unité de terminal ou à un socket.

Toutes les applications contenant le sous-programme Fcntl doivent être remplies avec _BSD défini sur une valeur spécifique. Les valeurs acceptables sont 43 et 44. De plus, toutes les applications socket doivent inclure la bibliothèque BSD libbsd.a .

Informations de verrouillage d'enregistrement général

Un verrou est soit Mise en oeuvre , soit Verrou consultatif , soit Lire ou Verrou en écriture.

Attention: L'entrée-sortie en mémoire tampon ne fonctionne pas correctement lorsqu'elle est utilisée avec le verrouillage de fichier. N'utilisez pas les routines de module d'E-S standard sur les fichiers qui vont être verrouillés.

Pour qu'un verrou soit un verrou forcé, l'attribut de verrouillage forcé du fichier doit être défini ; par exemple, le bit S_ENFMT doit être défini, mais les bits S_IXGRP, S_IXUSRet S_IXOTH doivent être clairs. Sinon, le verrou est un verrou consultatif. Un fichier donné peut avoir des verrous consultatifs ou appliqués, mais pas les deux. La description du fichier sys/mode.h inclut une description des attributs de fichier.

Lorsqu'un processus contient un verrou forcé sur une section d'un fichier, aucun autre processus ne peut accéder à cette section du fichier avec le sous-programme Lire ou écrire . En outre, les sous-routines Ouvert et Tronqué ne peuvent pas tronquer la section verrouillée du fichier, et le sous-programme Fclear ne peut pas modifier la section verrouillée du fichier. Si un autre processus tente de lire ou de modifier la section verrouillée du fichier, le processus dort jusqu'à ce que la section soit déverrouillée ou retourne avec une indication d'erreur.

Lorsqu'un processus contient un verrou consultatif sur une section d'un fichier, aucun autre processus ne peut verrouiller cette section du fichier (ou une section qui se chevauchent) avec le sous-programme Fcntl . (Aucune autre sous-routine n'est affectée.) Par conséquent, les processus doivent appeler volontairement le sous-programme Fcntl afin de rendre les verrouillages consultatifs effectifs.

Lorsqu'un processus contient un verrou en lecture sur une section d'un fichier, d'autres processus peuvent également définir des verrous de lecture sur cette section ou sur des sous-ensembles de celui-ci. Les verrous de lecture sont également appelés verrous Partagé .

Un verrou en lecture empêche tout autre processus de définir un verrou en écriture sur une partie quelconque de la zone protégée. Si le verrou en lecture est également un verrou imposé, aucun autre processus ne peut modifier la zone protégée.

Le descripteur de fichier sur lequel un verrou en lecture est placé doit avoir été ouvert avec un accès en lecture.

Lorsqu'un processus contient un verrou en écriture sur une section d'un fichier, aucun autre processus ne peut définir un verrou en lecture ou un verrou en écriture sur cette section. Les verrous d'écriture sont également appelés verrous Exclusif . Un seul verrou en écriture et aucun verrou en lecture peuvent exister pour une section spécifique d'un fichier à tout moment.

Si le verrou est également un verrou imposé, aucun autre processus ne peut lire ou modifier la zone protégée.

Les règles générales suivantes concernant le verrouillage de fichier s'appliquent:

  • La modification ou la déverrouillage d'une partie d'un fichier au milieu d'une section verrouillée laisse deux sections plus petites verrouillées à chaque extrémité de la section verrouillée.
  • Si le processus appelant contient un verrou sur un fichier, celui-ci peut être remplacé par des appels ultérieurs au sous-programme Fcntl .
  • Tous les verrous associés à un fichier pour un processus donné sont supprimés lorsque le processus ferme le descripteur de fichier N'importe quel pour ce fichier.
  • Les verrous ne sont pas hérités par un processus enfant après l'exécution d'une sous-routine Fourche .
    Remarque: Les blocages dus aux verrous de fichier dans un système distribué ne sont pas toujours détectés. Lorsque de tels blocages peuvent se produire, les programmes demandant les verrous doivent définir des temporisateurs de délai d'exécution.

Les verrous peuvent démarrer et s'étendre au-delà de la fin actuelle d'un fichier, mais ne peuvent pas être négatifs par rapport au début du fichier. Un verrou peut être défini pour s'étendre jusqu'à la fin du fichier en définissantl_lenSur 0. Si un tel verrou a également lel_startetl_whenceZones définies sur 0, le fichier entier est verrouillé. :NONE.l_len,l_start, etl_whenceLes zones de verrouillage font partie de la structure Flock .

Lorsqu'une application verrouille une région d'un fichier à l'aide de l'interface de verrouillage 32 bits (F_SETLK) et que le dernier octet de la plage de verrous inclut MAX_OFF (2 Gb-1), la plage de verrous de la demande de déverrouillage sera étendue à MAX_END (2 ^ ^ 63-1).

Paramètres

Article Descriptif
FileDescriptor Indique un descripteur de fichier ouvert obtenu à partir d'un appel réussi à la sous-routine Ouvert , sous-routine Fcntl , sous-routine Tubes ou sous-routine Shm_open . Les descripteurs de fichiers sont de petits entiers positifs utilisés (noms décalés) pour identifier les fichiers ou un objet de mémoire partagée.
Argument Indique une variable dont la valeur définit la fonction spécifiée par le paramètre Commande . Lors de la gestion des verrous de fichiers, le paramètre Argument doit être un pointeur vers la structure VERROUILLAGE .
Commande Indique l'opération effectuée par le sous-programme Fcntl . La sous-routine Fcntl peut dupliquer des descripteurs de fichier ouverts, définir des indicateurs de descripteur de fichier, des verrous de descripteur de fichier Ensemble , définir des ID de processuset des descripteurs de fichiers ouverts Fermer .

Duplication de descripteurs de fichier

Article Descriptif
F_DUPFD Renvoie un nouveau descripteur de fichier comme suit:
  • Le descripteur de fichier disponible le plus bas est supérieur ou égal au paramètre Argument
  • Les mêmes références d'objet que le fichier d'origine
  • Le même pointeur de fichier que le fichier d'origine (c'est-à-dire que les deux descripteurs de fichier partagent un pointeur de fichier si l'objet est un fichier)
  • Même mode d'accès (lecture, écriture ou lecture-écriture)
  • Les mêmes indicateurs de statut de fichier (c'est-à-dire, les deux descripteurs de fichier partagent les mêmes indicateurs de statut de fichier).
  • L'indicateur Fermeture-sur-exec (FD_CLOEXEC bit) associé au nouveau descripteur de fichier est effacé

Définition des indicateurs de descripteur de fichier

Article Descriptif
F_GETFD Extrait l'indicateur close-on-exec (bitFD_CLOEXEC ) associé au descripteur de fichier spécifié par le paramètre FileDescriptor . Le paramètre Argument est ignoré. Les indicateurs de descripteur de fichier sont associés à un descripteur de fichier unique et n'affectent pas les autres associés au même fichier.
F_SETFD Affecte la valeur du paramètre Argument à l'indicateur close-on-exec (bitFD_CLOEXEC ) associé au paramètre FileDescriptor . Si la valeur de l'indicateur FD_CLOEXEC est 0, le fichier reste ouvert sur tous les appels vers les sous-routines Exec ; sinon, le fichier se ferme sur l'exécution réussie d'une sous-routine Exec .
F_GETFL Extrait les indicateurs d'état de fichier et les modes d'accès aux fichiers pour la description de fichier ouvert associée au descripteur de fichier spécifié par le paramètre FileDescriptor . La description de fichier ouvert est définie au moment où le fichier est ouvert et s'applique uniquement aux descripteurs de fichier associés à cet appel spécifique au fichier. Ce descripteur de fichier ouvert n'affecte pas les autres descripteurs de fichier qui font référence au même fichier avec des descriptions de fichiers ouvertes différentes.

Les indicateurs d'état de fichier ont les valeurs suivantes:

O_APPEND
Définissez le mode d'ajout.
O_NONBLOCK
Pas de retard.

Les modes d'accès au fichier ont les valeurs suivantes:

O_RDONLY
Ouvert en lecture seule.
R_RDWR
Ouvert pour la lecture et l'écriture.
O_WRONLY
Ouvert uniquement pour l'écriture.

Les indicateurs d'accès au fichier peuvent être extraits de la valeur de retour à l'aide du masque O_ACCMODE , qui est défini dans le fichier fcntl.h .

F_SETFL Définit les indicateurs d'état du fichier à partir des bits correspondants spécifiés par le paramètre Argument . Les indicateurs d'état de fichier sont définis pour la description de fichier ouvert associée au descripteur de fichier spécifié par le paramètre FileDescriptor . Les indicateurs suivants peuvent être définis:
  • O_APPEND ou AJOUTER
  • O_NDELAY ou RETARD
  • O_NONBLOCK ou FNONBLOC
  • _SYNC ou FSYNC
  • FASYNC

Les indicateurs O_NDELAY et O_NONBLOCK affectent uniquement les opérations sur les descripteurs de fichier dérivés du même sous-programme Ouvert . Dans BSD, ces opérations s'appliquent à tous les descripteurs de fichier qui font référence à l'objet.

Définition des verrous de fichier

Article Descriptif
F_GETLK Extrait des informations sur le premier verrou qui bloque le verrou décrit dans la structure Flock . Le paramètre Argument doit être un pointeur vers un type struct flock, comme défini dans le fichier flock.h . Les informations extraites par le sous-programme Fcntl écrin les informations dans Struct Flock pointé par le paramètre Argument . Si aucun verrou n'est détecté pour empêcher la création de ce verrou, la structure reste inchangée, à l'exception du type de verrouillage (l_type) Qui est défini sur F_UNLCK.
F_SETLK Définit ou efface un verrou de segment de fichier en fonction de la description de verrouillage indiquée par le paramètre Argument . Le paramètre Argument doit être un pointeur vers un type struct flock, qui est défini dans le fichier flock.h . L'option F_SETLK permet d'établir des verrous de lecture (ou partagés) (F_RDLCK) ou d'écriture (ou exclusive) de verrous (F_WRLCK), ainsi que de supprimer l'un ou l'autre type de verrou (F_UNLCK). Les types de verrou sont définis par le fichier fcntl.h . Si un verrou partagé ou exclusif ne peut pas être défini, la sous-routine Fcntl renvoie immédiatement.
F_SETLKW Effectuait la même fonction que l'option F_SETLK , sauf si un verrou en lecture ou en écriture est bloqué par des verrous existants, auquel cas le processus dort jusqu'à ce que la section du fichier soit verrouillée. Si un signal à attraper est reçu alors que la sous-routine fcntl attend une région, la sous-routine fcntl est interrompue, renvoie un -1, met la variable globale errno à EINTR. L'opération de verrouillage n'est pas effectuée.
Article Descriptif
F_GETLK64 Extrait des informations sur le premier verrou qui bloque le verrou décrit dans la structure flock64 . Le paramètre Argument doit être un pointeur vers un objet de type struct flock64, comme défini dans le fichier flock.h . Les informations extraites par la sous-routine fcntl écrasent les informations de la structure struct flock64 pointée par le paramètre Argument . Si aucun verrou n'est détecté pour empêcher la création de ce verrou, la structure reste inchangée, à l'exception du type de verrouillage (l_type) Qui est défini sur F_UNLCK.
F_SETLK64 Définit ou efface un verrou de segment de fichier en fonction de la description de verrouillage indiquée par le paramètre Argument . Le paramètre Argument doit être un pointeur vers un type struct flock64, qui est défini dans le fichier flock.h . L'option F_SETLK permet d'établir des verrous de lecture (ou partagés) (F_RDLCK) ou d'écriture (ou exclusive) de verrous (F_WRLCK), ainsi que de supprimer l'un ou l'autre type de verrou (F_UNLCK). Les types de verrou sont définis par le fichier fcntl.h . Si un verrou partagé ou exclusif ne peut pas être défini, la sous-routine Fcntl renvoie immédiatement.
F_SETLKW64 Effectuait la même fonction que l'option F_SETLK , sauf si un verrou en lecture ou en écriture est bloqué par des verrous existants, auquel cas le processus dort jusqu'à ce que la section du fichier soit verrouillée. Si un signal à attraper est reçu alors que la sous-routine fcntl attend une région, la sous-routine fcntl est interrompue, renvoie un -1, met la variable globale errno à EINTR. L'opération de verrouillage n'est pas effectuée.

Définition de l'ID de processus

Article Descriptif
F_GETOWN Extrait l'ID de processus ou le groupe de processus qui reçoit actuellement des signaux SIGIO et SIGURG . Les groupes de processus sont renvoyés en tant que valeurs négatives.
F_SETOWN Définit le processus ou le groupe de processus pour recevoir les signaux SIGIO et SIGURG . Les groupes de processus sont spécifiés en fournissant une valeur Argument négative. Sinon, le paramètre Argument est interprété comme un ID de processus.

Fermeture de descripteurs de fichier

Article Descriptif
F_CLOSEM Ferme tous les descripteurs de fichier de FileDescriptor jusqu'au descripteur de fichier actuellement ouvert le plus élevé (U_maxofile).
Ancienne Indique un descripteur de fichier ouvert.
Nouveau Indique un descripteur de fichier ouvert qui est renvoyé par le sous-programme dup2 .

Interfaces de compatibilité

Sous-routine lockfx

Les fonctions de sous-routine Fcntl sont similaires à la sous-routine Lockfx , lorsque le paramètre Commande est F_SETLK, F_SETLKWou F_GETLK, et lorsqu'il est utilisé de la manière suivante:

fcntl (FileDescriptor, Command, Argument)

équivaut à :

lockfx (FileDescriptor, Command, Argument)

Sous-routines dup et dup2

Les fonctions de sous-routine Fcntl sont similaires aux sous-routines Dup et dup2 , lorsqu'ils sont utilisés de la manière suivante:

dup (FileDescriptor)

équivaut à :

fcntl (FileDescriptor, F_DUPFD, 0)
dup2 (Old, New)

équivaut à :

close (New);
fcntl(Old, F_DUPFD, New)

Les sous-routines Dup et dup2 diffèrent de la sous-routine Fcntl de l'une des manières suivantes:

  • Si le descripteur de fichier spécifié par le paramètre New est supérieur ou égal à OPEN_MAX, le sous-programme dup2 renvoie un -1 et affecte la valeur EBADF à la variable errno.
  • Si le descripteur de fichier spécifié par le paramètre Ancien est valide et égal au descripteur de fichier spécifié par le paramètre Nouveau , le sous-programme dup2 renvoie le descripteur de fichier spécifié par le paramètre Nouveau , sans la fermer.
  • Si le descripteur de fichier indiqué par le paramètre Ancien n'est pas valide, la sous-routine dup2 échoue et ne ferme pas le descripteur de fichier spécifié par le paramètre Nouveau .
  • La valeur renvoyée par les sous-programmes dup et dup2 est égale au paramètre New en cas d'exécution réussie ; dans le cas contraire, la valeur renvoyée est -1.

Valeurs renvoyées

Une fois l'exécution terminée, la valeur renvoyée dépend de la valeur du paramètre Commande , comme suit:

Article Descriptif
Commande Valeur renvoyée
F_DUPFD Un nouveau descripteur de fichier
F_GETFD Valeur de l'indicateur (seul le bit FD_CLOEXEC est défini)
F_SETFD Une valeur autre que -1
F_GETFL Valeur des indicateurs de fichier
F_SETFL Une valeur autre que -1
F_GETOWN La valeur du propriétaire du descripteur
F_SETOWN Une valeur autre que -1
F_GETLK Une valeur autre que -1
F_SETLK Une valeur autre que -1
F_SETLKW Une valeur autre que -1
F_CLOSEM Une valeur autre que -1.

Si la sous-routine fcntl échoue, la valeur -1 est renvoyée et la variable globale errno est définie pour indiquer l'erreur.

Codes d'erreur

La sous-routine Fcntl échoue si une ou plusieurs des opérations suivantes sont vraies:

Article Descriptif
EACCES L'argument Commande est F_SETLK; le type de verrou est un verrou partagé ou exclusif et le segment d'un fichier à verrouiller est déjà verrouillé par un autre processus, ou le type est un verrou exclusif et une partie du segment d'un fichier à verrouiller est déjà verrouillé ou exclusif-verrouillé par un autre processus.
EBADF Le paramètre FileDescriptor n'est pas un descripteur de fichier ouvert valide.
EDEADLK L'argument Commande est F_SETLKW; le verrou est bloqué par un verrou à partir d'un autre processus et met le processus d'appel en veille, en attendant que ce verrou devienne libre entraînerait un blocage.
ENOTTY Le descripteur de fichier ne fait pas référence à une unité de terminal ou à un socket.
EMFICHIER Le paramètre Commande est F_DUPFDet le nombre maximal de descripteurs de fichier est actuellement ouvert (OPEN_MAX).
EINVAL Le paramètre Commande est F_DUPFDet le paramètre Argument est négatif ou supérieur ou égal à OPEN_MAX.
EINVAL Une valeur non conforme a été fournie pour le paramètre Commande.
EINVAL Une tentative de verrouillage d'un élément fifo ou d'un tube. a été effectuée.
ESRCH La valeur du paramètre Commande est F_SETOWNet l'ID de processus spécifié comme paramètre Argument n'est pas utilisé.
EINTR Le paramètre Commande était F_SETLKW et le processus a reçu un signal en attendant d'acquérir le verrou.
EDÉBORDEMENT Le paramètre Commande était F_GETLK et le verrou de bloc n'a pas pu être représenté dans la structure Flock .

Les sous-routines Dup et dup2 échouent si l'une ou les deux des sous-routines suivantes sont vraies:

Article Descriptif
EBADF Le paramètre Ancien indique un descripteur de fichier ouvert non valide ou le paramètre Nouveau indique un descripteur de fichier hors plage.
EMFICHIER Le nombre de descripteurs de fichier dépasse la valeur OPEN_MAX ou il n'y a pas de descripteur de fichier au-dessus de la valeur du paramètre Nouveau .

Si NFS est installé sur le système, la sous-routine fcntl peut échouer si les conditions suivantes sont réunies:

Article Descriptif
ETIMEDOUT La connexion a expiré.