dup() og dup2() Linux-systemanrop

dup() og dup2() Linux-systemanrop

dup()

Dup()-systemkallet lager en kopi av en filbeskrivelse.

  • Den bruker den laveste ubrukte beskrivelsen for den nye beskrivelsen.
  • Hvis kopien er vellykket opprettet, kan original- og kopifilbeskrivelsene brukes om hverandre.
  • De refererer begge til den samme åpne filbeskrivelsen og deler dermed filforskyvning og filstatusflagg.

Syntaks:

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

Merk at dette programmet ikke vil kjøre i den elektroniske kompilatoren da det inkluderer å åpne en fil og skrive på den.

Forklaring:

Open() returnerer en filbeskrivelse file_desc til filen som heter 'dup.txt'. file_desc kan brukes til å utføre noen filoperasjoner med filen 'dup.txt'. Etter å ha brukt dup()-systemkallet opprettes en kopi av file_desc copy_desc. Denne kopien kan også brukes til å utføre en filoperasjon med den samme filen 'dup.txt'. Etter to skriveoperasjoner en med file_desc og en annen med copy_desc redigeres samme fil, dvs. 'dup.txt'. Før du kjører koden La filen 'dup.txt' før skriveoperasjonen være som vist nedenfor:

dup() og dup2() Linux-systemanrop

Etter å ha kjørt C-programmet vist ovenfor, er filen 'dup.txt' som vist nedenfor:

dup() og dup2() Linux-systemanrop

dup2()

Dup2()-systemkallet ligner på dup(), men den grunnleggende forskjellen mellom dem er at i stedet for å bruke den lavest nummererte ubrukte filbeskrivelsen, bruker den deskriptornummeret spesifisert av brukeren.

Syntaks:

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

Viktige punkter:

  • Inkluder overskriftsfilen unistd.h for bruk av dup() og dup2() systemkall.
  • Hvis deskriptoren newfd tidligere var åpen, lukkes den stille før den brukes på nytt.
  • Hvis oldfd ikke er en gyldig filbeskrivelse, mislykkes samtalen og newfd lukkes ikke.
  • Hvis oldfd er en gyldig filbeskrivelse og newfd har samme verdi som oldfd, gjør dup2() ingenting og returnerer newfd.

En vanskelig bruk av dup2() systemkall:

Som i dup2() i stedet for newfd kan en hvilken som helst filbeskrivelse settes. Nedenfor er en C-implementering der filbeskrivelsen til Standard output (stdout) brukes. Dette vil føre til at alle printf()-setningene skrives i filen som refereres til av den gamle filbeskrivelsen.

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

Dette kan sees i figuren nedenfor: La filen 'tricky.txt' før dup2()-operasjonen være som vist nedenfor:

dup() og dup2() Linux-systemanrop

Etter å ha kjørt C-programmet vist ovenfor, er filen 'tricky.txt' som vist nedenfor:

dup() og dup2() Linux-systemanrop Lag quiz