Die dup2-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion dup2, um einen Dateideskriptor in C zu duplizieren
  2. Verwenden Sie die Funktion dup, um einen Dateideskriptor in C zu duplizieren
Die dup2-Funktion in C

In diesem Artikel werden verschiedene Methoden zur Verwendung der dup2-Funktion in C erklärt.

Verwenden Sie die Funktion dup2, um einen Dateideskriptor in C zu duplizieren

Dateien werden normalerweise manipuliert, nachdem sie mit dem Systemaufruf open geöffnet wurden. Bei Erfolg gibt open einen neuen Dateideskriptor zurück, der mit der neu geöffneten Datei verknüpft ist. In Unix-basierten Systemen verwaltet das Betriebssystem für jedes laufende Programm eine Liste der geöffneten Dateien, die sogenannte Dateitabelle. Jeder Eintrag wird durch eine Ganzzahl vom Typ int dargestellt. Diese Ganzzahlen werden in diesen Systemen Dateideskriptoren genannt, und viele Systemaufrufe nehmen Dateideskriptorwerte als Parameter.

Jedes laufende Programm hat standardmäßig drei offene Dateideskriptoren, wenn der Prozess erstellt wird, es sei denn, sie entscheiden sich, diese explizit zu schließen. Die Funktion dup2 erstellt eine Kopie des angegebenen Dateideskriptors und weist ihm eine neue Ganzzahl zu. dup2 nimmt einen zu klonenden alten Dateideskriptor als ersten Parameter und der zweite Parameter ist die Ganzzahl für einen neuen Dateideskriptor. Dadurch zeigen beide Dateideskriptoren auf die gleiche Datei und können austauschbar verwendet werden. Beachten Sie, dass, wenn der Benutzer als zweiten Parameter eine Ganzzahl angibt, die derzeit von der geöffneten Datei verwendet wird, diese geschlossen und dann als geklonter Dateideskriptor wiederverwendet wird.

#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);
}

Ausgabe:

tmp.txt fd = 3

Das obige Beispiel demonstriert die grundlegende Verwendung der Funktion dup2, bei der eine beliebige Datei mit dem Namen tmp.txt im Modus append geöffnet und ein formatierter Text in sie geschrieben wird. Der Standard-Dateideskriptor ist 3, der vom Systemaufruf open zurückgegeben wird. Nachdem wir den Funktionsaufruf dup2 mit dem zweiten Argument 121 ausgeführt haben, kann die gleiche Datei mit dem neuen Dateideskriptor angesprochen werden. Folglich rufen wir die Funktion dprintf auf, die der Funktion printf ähnlich ist, außer dass sie ein zusätzliches Dateideskriptor-Argument entgegennimmt, das das Ziel für die Ausgabe angibt.

Verwenden Sie die Funktion dup, um einen Dateideskriptor in C zu duplizieren

Alternativ dazu kann eine andere Funktion namens dup einen Dateideskriptor ähnlich wie dup2 klonen. Allerdings nimmt die Funktion dup ein einzelnes Argument des zu kopierenden Dateideskriptors und gibt den neu erstellten automatisch zurück. Das folgende Beispiel demonstriert die Verwendung von dup, wobei wir den zurückgegebenen Wert in einem int-Typ speichern und dann die Funktion dprintf an den abgerufenen Dateideskriptor übergeben. Beachten Sie, dass der Benutzer für die Implementierung der Fehlerprüfroutinen für beide Funktionen verantwortlich ist, um die erfolgreiche Ausführung zu überprüfen. Siehe die Handbuchseite dup/dup2 für die spezifischen Details hier.

#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);
}
Autor: 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

Verwandter Artikel - C File