La fonction dup2 en C
-
Utiliser la fonction
dup2
pour dupliquer un descripteur de fichier en C -
Utilisez la fonction
dup
pour dupliquer un descripteur de fichier en C
Cet article explique plusieurs méthodes d’utilisation de la fonction dup2
en C.
Utiliser la fonction dup2
pour dupliquer un descripteur de fichier en C
Les fichiers sont généralement manipulés après avoir été ouverts en utilisant l’appel système open
. En cas de succès, open
renvoie un nouveau descripteur de fichier associé au fichier nouvellement ouvert. Dans les systèmes basés sur Unix, le système d’exploitation maintient une liste de fichiers ouverts pour chaque programme en cours d’exécution, appelée table de fichiers. Chaque entrée est représentée par un entier de type int
. Ces entiers sont appelés descripteurs de fichiers dans ces systèmes, et de nombreux appels système prennent les valeurs des descripteurs de fichiers comme paramètres.
Chaque programme en cours d’exécution possède par défaut trois descripteurs de fichiers ouverts lors de la création du processus, à moins qu’il ne choisisse de les fermer explicitement. La fonction dup2
crée une copie du descripteur de fichier donné et lui attribue un nouvel entier. La fonction dup2
prend un ancien descripteur de fichier à cloner comme premier paramètre et le second paramètre est l’entier pour un nouveau descripteur de fichier. Par conséquent, ces deux descripteurs de fichier pointent vers le même fichier et peuvent être utilisés de manière interchangeable. Notez que si l’utilisateur spécifie un entier actuellement utilisé par le fichier ouvert comme deuxième paramètre, il sera fermé puis réutilisé comme descripteur de fichier cloné.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern int counter;
int main(void) {
int fd = open("tmp.txt", O_WRONLY | O_APPEND);
printf("tmp.txt fd = %d\n", fd);
dup2(fd, 121);
dprintf(121, "This string will be printed in tmp.txt file\n");
exit(EXIT_SUCCESS);
}
Production :
tmp.txt fd = 3
L’exemple ci-dessus démontre l’utilisation de base de la fonction dup2
, où un fichier arbitraire nommé tmp.txt
est ouvert en mode add
, et un texte formaté y est écrit. Le descripteur de fichier par défaut est 3
, renvoyé par l’appel système open
. Après avoir exécuté l’appel de fonction dup2
avec le second argument de 121
, le même fichier peut être adressé en utilisant le nouveau descripteur de fichier. Par conséquent, nous appelons la fonction dprintf
, qui est similaire à la fonction printf
sauf qu’elle prend un argument supplémentaire du descripteur de fichier spécifiant la destination pour écrire la sortie.
Utilisez la fonction dup
pour dupliquer un descripteur de fichier en C
Alternativement, une autre fonction appelée dup
fait du clonage de descripteur de fichier similaire au dup2
. Cependant, la fonction dup
prend un seul argument de descripteur de fichier à copier et renvoie automatiquement le descripteur nouvellement créé. L’exemple suivant démontre l’utilisation de la fonction dup
, où nous stockons la valeur retournée dans un type int
et passons ensuite la fonction dprintf
au descripteur de fichier récupéré. Notez que l’utilisateur est responsable de l’implémentation des routines de vérification d’erreur pour les deux fonctions afin de vérifier la bonne exécution. Voir la page de manuel dup
/dup2
pour les détails spécifiques ici.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern int counter;
int main(void) {
int fd = open("tmp2.txt", O_WRONLY | O_APPEND);
printf("tmp2.txt fd = %d\n", fd);
int dup_fd = dup(fd);
dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook