logo

dup() og dup2() Linux-systemkald

dup()

Dup()-systemkaldet opretter en kopi af en filbeskrivelse.

  • Den bruger den lavest nummererede ubrugte deskriptor til den nye deskriptor.
  • Hvis kopien er oprettet med succes, kan original- og kopifilbeskrivelserne bruges i flæng.
  • De refererer begge til den samme åbne filbeskrivelse og deler således filoffset- og filstatusflag.

Syntaks:



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

Bemærk, at dette program ikke kører i online-kompileren, da det inkluderer at åbne en fil og skrive på den.

Forklaring:

Open() returnerer en filbeskrivelse file_desc til filen med navnet 'dup.txt'. file_desc kan bruges til at udføre nogle filoperationer med filen 'dup.txt'. Efter brug af dup()-systemkaldet oprettes en kopi af file_desc copy_desc. Denne kopi kan også bruges til at udføre en filoperation med den samme fil 'dup.txt'. Efter to skriveoperationer en med file_desc og en anden med copy_desc redigeres samme fil, dvs. 'dup.txt'. Før du kører koden, lad filen 'dup.txt' før skrivehandlingen være som vist nedenfor:

java returkommando
dup() og dup2() Linux-systemkald

Efter at have kørt C-programmet vist ovenfor, er filen 'dup.txt' som vist nedenfor:

dup() og dup2() Linux-systemkald

dup2()

Dup2()-systemkaldet ligner dup(), men den grundlæggende forskel mellem dem er, at i stedet for at bruge den lavest nummererede ubrugte filbeskrivelse, bruger den deskriptornummeret angivet af brugeren.

Syntaks:

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

Vigtige punkter:

ulemper ved internettet
  • Inkluder header-filen unistd.h til brug af dup() og dup2() systemkald.
  • Hvis deskriptoren newfd tidligere var åben, lukkes den lydløst, før den genbruges.
  • Hvis oldfd ikke er en gyldig filbeskrivelse, mislykkes opkaldet, og newfd lukkes ikke.
  • Hvis oldfd er en gyldig filbeskrivelse, og newfd har samme værdi som oldfd, gør dup2() intet og returnerer newfd.

En vanskelig brug af dup2() systemkald:

Som i dup2() i stedet for newfd kan enhver filbeskrivelse sættes. Nedenfor er en C-implementering, hvor filbeskrivelsen af ​​Standard output (stdout) bruges. Dette vil føre til, at alle printf()-sætningerne skrives i filen, der henvises til af den gamle filbeskrivelse.

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

Dette kan ses i figuren vist nedenfor: Lad filen 'tricky.txt' før dup2()-operationen være som vist nedenfor:

dup() og dup2() Linux-systemkald

Efter at have kørt C-programmet vist ovenfor, er filen 'tricky.txt' som vist nedenfor:

dup() og dup2() Linux-systemkald Opret quiz