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:
|
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:
Les modes d'accès au fichier ont les valeurs suivantes:
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:
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é. |