logo

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

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:

dup() und dup2() Linux-Systemaufruf

Nach dem Ausführen des oben gezeigten C-Programms sieht die Datei „dup.txt“ wie folgt aus:

dup() und dup2() Linux-Systemaufruf

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.txtn');   return 0; } 

Dies ist in der folgenden Abbildung zu sehen: Die Datei „tricky.txt“ vor der Operation dup2() sei wie folgt:

dup() und dup2() Linux-Systemaufruf

Nach dem Ausführen des oben gezeigten C-Programms sieht die Datei „tricky.txt“ wie folgt aus:

dup() und dup2() Linux-Systemaufruf Quiz erstellen