logo

appel système Linux dup() et dup2()

dup()

L'appel système dup() crée une copie d'un descripteur de fichier.

  • Il utilise le descripteur inutilisé portant le numéro le plus petit pour le nouveau descripteur.
  • Si la copie est créée avec succès, les descripteurs de fichier d'origine et de copie peuvent être utilisés de manière interchangeable.
  • Ils font tous deux référence à la même description de fichier ouvert et partagent donc des indicateurs de décalage et d'état de fichier.

Syntaxe:



    int dup(int oldfd);     
oldfd: old file descriptor whose copy is to be created.
C
// C program to illustrate dup()  #include #include  #include  int main() {  // open() returns a file descriptor file_desc to a   // the file 'dup.txt' here'  int file_desc = open('dup.txt' O_WRONLY | O_APPEND);    if(file_desc < 0)  printf('Error opening the filen');    // dup() will create the copy of file_desc as the copy_desc  // then both can be used interchangeably.  int copy_desc = dup(file_desc);    // write() will write the given string into the file  // referred by the file descriptors  write(copy_desc'This will be output to the file named dup.txtn' 46);    write(file_desc'This will also be output to the file named dup.txtn' 51);    return 0; } 

Notez que ce programme ne fonctionnera pas dans le compilateur en ligne car il inclut l'ouverture d'un fichier et l'écriture dessus.

Explication:

open() renvoie un descripteur de fichier file_desc au fichier nommé 'dup.txt'. file_desc peut être utilisé pour effectuer certaines opérations sur les fichiers avec le fichier 'dup.txt'. Après avoir utilisé l'appel système dup(), une copie de file_desc est créée copy_desc. Cette copie peut également être utilisée pour effectuer certaines opérations sur les fichiers avec le même fichier « dup.txt ». Après deux opérations d'écriture, une avec file_desc et une autre avec copy_desc, le même fichier est édité, c'est-à-dire 'dup.txt'. Avant d'exécuter le code, laissez le fichier 'dup.txt' avant l'opération d'écriture comme indiqué ci-dessous :

hashset vs hashmap
appel système Linux dup() et dup2()

Après avoir exécuté le programme C affiché ci-dessus, le fichier « dup.txt » se présente comme indiqué ci-dessous :

appel système Linux dup() et dup2()

dup2()

L'appel système dup2() est similaire à dup() mais la différence fondamentale entre eux est qu'au lieu d'utiliser le descripteur de fichier inutilisé portant le numéro le plus petit, il utilise le numéro de descripteur spécifié par l'utilisateur.

Syntaxe:

int dup2(int oldfd int newfd);  
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

Points importants :

  • Incluez le fichier d'en-tête unistd.h pour utiliser les appels système dup() et dup2().
  • Si le descripteur newfd était précédemment ouvert, il est fermé silencieusement avant d'être réutilisé.
  • Si oldfd n'est pas un descripteur de fichier valide, l'appel échoue et newfd n'est pas fermé.
  • Si oldfd est un descripteur de fichier valide et que newfd a la même valeur que oldfd alors dup2() ne fait rien et renvoie newfd.

Une utilisation délicate de l'appel système dup2() :

Comme dans dup2(), à la place de newfd, n'importe quel descripteur de fichier peut être mis. Vous trouverez ci-dessous une implémentation C dans laquelle le descripteur de fichier de sortie standard (stdout) est utilisé. Cela conduira à ce que toutes les instructions printf() soient écrites dans le fichier référencé par l'ancien descripteur de fichier.

C
// C program to illustrate dup2()  #include #include #include #include int main() {  int file_desc = open('tricky.txt'O_WRONLY | O_APPEND);    // here the newfd is the file descriptor of stdout (i.e. 1)  dup2(file_desc 1) ;     // All the printf statements will be written in the file  // 'tricky.txt'  printf('I will be printed in the file tricky.txtn');   return 0; } 

Cela peut être vu dans la figure ci-dessous : Laissez le fichier 'tricky.txt' avant l'opération dup2() être comme indiqué ci-dessous :

appel système Linux dup() et dup2()

Après avoir exécuté le programme C affiché ci-dessus, le fichier « tricky.txt » se présente comme indiqué ci-dessous :

appel système Linux dup() et dup2() Créer un quiz