logo

dup() en dup2() Linux-systeemaanroep

dup()

De systeemaanroep dup() maakt een kopie van een bestandsdescriptor.

  • Het gebruikt de laagst genummerde ongebruikte descriptor voor de nieuwe descriptor.
  • Als de kopie met succes is gemaakt, kunnen de origineel- en kopiebestandsbeschrijvingen door elkaar worden gebruikt.
  • Ze verwijzen allebei naar dezelfde open bestandsbeschrijving en delen dus bestandsoffset- en bestandsstatusvlaggen.

Syntaxis:



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

Houd er rekening mee dat dit programma niet in de online compiler kan worden uitgevoerd, omdat u hierbij een bestand moet openen en ernaar moet schrijven.

Uitleg:

Open() retourneert een bestandsdescriptor file_desc naar het bestand met de naam 'dup.txt'. file_desc kan worden gebruikt om een ​​bestandsbewerking uit te voeren met het bestand 'dup.txt'. Na gebruik van de dup() systeemaanroep wordt een kopie van file_desc gemaakt copy_desc. Deze kopie kan ook worden gebruikt om een ​​bestandsbewerking uit te voeren met hetzelfde bestand 'dup.txt'. Na twee schrijfbewerkingen, één met file_desc en één met copy_desc, wordt hetzelfde bestand bewerkt, d.w.z. 'dup.txt'. Voordat u de code uitvoert, laat het bestand 'dup.txt' vóór de schrijfbewerking er uitzien zoals hieronder weergegeven:

dup() en dup2() Linux-systeemaanroep

Na het uitvoeren van het hierboven getoonde C-programma ziet het bestand 'dup.txt' eruit zoals hieronder weergegeven:

tekenreeks naar int
dup() en dup2() Linux-systeemaanroep

dup2()

De systeemaanroep dup2() is vergelijkbaar met dup() maar het fundamentele verschil tussen beide is dat in plaats van de ongebruikte bestandsdescriptor met het laagste nummer te gebruiken, het descriptornummer wordt gebruikt dat door de gebruiker is opgegeven.

Syntaxis:

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

Belangrijke punten:

  • Voeg het headerbestand unistd.h toe voor het gebruik van dup() en dup2() systeemaanroepen.
  • Als de descriptor newfd eerder open was, wordt deze stil gesloten voordat deze opnieuw wordt gebruikt.
  • Als oldfd geen geldige bestandsdescriptor is, mislukt de aanroep en wordt newfd niet gesloten.
  • Als oldfd een geldige bestandsdescriptor is en newfd dezelfde waarde heeft als oldfd, dan doet dup2() niets en retourneert newfd.

Een lastig gebruik van dup2() systeemaanroep:

Net als in dup2() kan in plaats van newfd elke bestandsdescriptor worden geplaatst. Hieronder staat een C-implementatie waarin de bestandsdescriptor van standaarduitvoer (stdout) wordt gebruikt. Dit zal ertoe leiden dat alle printf()-instructies worden geschreven in het bestand waarnaar wordt verwezen door de oude bestandsdescriptor.

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

Dit is te zien in de onderstaande afbeelding: Laat het bestand 'tricky.txt' vóór de dup2()-bewerking er uitzien zoals hieronder weergegeven:

willekeurig getal gen java
dup() en dup2() Linux-systeemaanroep

Na het uitvoeren van het hierboven getoonde C-programma ziet het bestand 'tricky.txt' eruit zoals hieronder weergegeven:

dup() en dup2() Linux-systeemaanroep Quiz maken