dup() und dup2() Linux-Systemaufruf
dup()
Der Systemaufruf dup() erstellt eine Kopie eines Dateideskriptors.
- Für den neuen Deskriptor wird der unbenutzte Deskriptor mit der niedrigsten Nummer verwendet.
- Wenn die Kopie erfolgreich erstellt wurde, können die ursprünglichen und kopierten Dateideskriptoren austauschbar verwendet werden.
- Sie beziehen sich beide auf dieselbe offene Dateibeschreibung und teilen sich daher den Datei-Offset und die Dateistatus-Flags.
Syntax:
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 file n ' ); // 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.txt n ' 46 ); write ( file_desc 'This will also be output to the file named dup.txt n ' 51 ); return 0 ; } Beachten Sie, dass dieses Programm nicht im Online-Compiler ausgeführt werden kann, da es das Öffnen einer Datei und das Schreiben darauf umfasst.
Erläuterung:
open() gibt einen Dateideskriptor file_desc für die Datei mit dem Namen „dup.txt“ zurück. file_desc kann verwendet werden, um einige Dateioperationen mit der Datei „dup.txt“ durchzuführen. Nach Verwendung des Systemaufrufs dup() wird eine Kopie von file_desc erstellt, copy_desc. Diese Kopie kann auch verwendet werden, um einige Dateioperationen mit derselben Datei „dup.txt“ durchzuführen. Nach zwei Schreibvorgängen, einer mit file_desc und einer mit copy_desc, wird dieselbe Datei bearbeitet, d. h. „dup.txt“. Bevor Sie den Code ausführen, muss die Datei „dup.txt“ vor dem Schreibvorgang wie folgt aussehen:
![]()
Nach dem Ausführen des oben gezeigten C-Programms sieht die Datei „dup.txt“ wie folgt aus:
![]()
dup2()
Der Systemaufruf dup2() ähnelt dup(), der grundlegende Unterschied besteht jedoch darin, dass er anstelle des nicht verwendeten Dateideskriptors mit der niedrigsten Nummer die vom Benutzer angegebene Deskriptornummer verwendet.
Syntax:
int dup2(int oldfd int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.Wichtige Punkte:
- Fügen Sie die Header-Datei unistd.h für die Verwendung der Systemaufrufe dup() und dup2() ein.
- Wenn der Deskriptor newfd zuvor geöffnet war, wird er stillschweigend geschlossen, bevor er wiederverwendet wird.
- Wenn oldfd kein gültiger Dateideskriptor ist, schlägt der Aufruf fehl und newfd wird nicht geschlossen.
- Wenn oldfd ein gültiger Dateideskriptor ist und newfd denselben Wert wie oldfd hat, führt dup2() nichts aus und gibt newfd zurück.
Eine knifflige Verwendung des Systemaufrufs dup2():
Wie in dup2() kann anstelle von newfd ein beliebiger Dateideskriptor eingefügt werden. Nachfolgend finden Sie eine C-Implementierung, in der der Dateideskriptor der Standardausgabe (stdout) verwendet wird. Dies führt dazu, dass alle printf()-Anweisungen in die Datei geschrieben werden, auf die der alte Dateideskriptor verweist.
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.txt n ' ); return 0 ; }
Dies ist in der folgenden Abbildung zu sehen: Die Datei „tricky.txt“ vor der Operation dup2() sei wie folgt:
Nach dem Ausführen des oben gezeigten C-Programms sieht die Datei „tricky.txt“ wie folgt aus:
Quiz erstellen