La fonction dup2 en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction dup2 pour dupliquer un descripteur de fichier en C
  2. Utilisez la fonction dup pour dupliquer un descripteur de fichier en C
La fonction dup2 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);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C File