Die dup2-Funktion in C
-
Verwenden Sie die Funktion
dup2
, um einen Dateideskriptor in C zu duplizieren -
Verwenden Sie die Funktion
dup
, um einen Dateideskriptor in C zu duplizieren
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);
}
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