logo

dup() och dup2() Linux-systemanrop

dup()

Systemanropet dup() skapar en kopia av en filbeskrivning.

  • Den använder den lägsta numrerade oanvända deskriptorn för den nya deskriptorn.
  • Om kopian har skapats framgångsrikt kan original- och kopiafilbeskrivningarna användas omväxlande.
  • De hänvisar båda till samma öppna filbeskrivning och delar därmed filoffset och filstatusflaggor.

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

Observera att det här programmet inte kommer att köras i onlinekompilatorn eftersom det inkluderar att öppna en fil och skriva på den.

Förklaring:

hur många veckor på en månad

Open() returnerar en filbeskrivning file_desc till filen som heter 'dup.txt'. file_desc kan användas för att utföra vissa filoperationer med filen 'dup.txt'. Efter att ha använt dup()-systemanropet skapas en kopia av file_desc copy_desc. Denna kopia kan också användas för att utföra en filoperation med samma fil 'dup.txt'. Efter två skrivoperationer, en med file_desc och en annan med copy_desc redigeras samma fil, dvs 'dup.txt'. Innan du kör koden Låt filen 'dup.txt' före skrivoperationen vara som visas nedan:

dup() och dup2() Linux-systemanrop

Efter att ha kört C-programmet som visas ovan är filen 'dup.txt' som visas nedan:

dup() och dup2() Linux-systemanrop

dup2()

Systemanropet dup2() liknar dup() men den grundläggande skillnaden mellan dem är att istället för att använda den lägsta numrerade oanvända filbeskrivningen använder den deskriptornumret som anges av användaren.

Syntax:

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

Viktiga punkter:

  • Inkludera rubrikfilen unistd.h för att använda dup() och dup2() systemanrop.
  • Om deskriptorn newfd tidigare var öppen stängs den tyst innan den återanvänds.
  • Om oldfd inte är en giltig filbeskrivning misslyckas samtalet och newfd stängs inte.
  • Om oldfd är en giltig filbeskrivning och newfd har samma värde som oldfd gör dup2() ingenting och returnerar newfd.

En knepig användning av dup2() systemanrop:

Som i dup2() i stället för newfd kan vilken filbeskrivning som helst sättas. Nedan finns en C-implementering där filbeskrivningen för Standard output (stdout) används. Detta leder till att alla printf()-satser skrivs i filen som hänvisas till av den gamla filbeskrivningen.

s i python
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; } 

Detta kan ses i figuren nedan: Låt filen 'tricky.txt' före dup2()-operationen vara som visas nedan:

dup() och dup2() Linux-systemanrop

Efter att ha kört C-programmet som visas ovan är filen 'tricky.txt' som visas nedan:

dup() och dup2() Linux-systemanrop Skapa frågesport