logo

dup() és dup2() Linux rendszerhívás

dup()

A dup() rendszerhívás létrehozza a fájlleíró másolatát.

  • A legalacsonyabb számú nem használt leírót használja az új leíróhoz.
  • Ha a másolatot sikeresen létrehozták, akkor az eredeti és a másolatfájl leírója felcserélhetően használható.
  • Mindkettő ugyanarra a nyitott fájlleírásra hivatkozik, és így megosztják a fájl eltolást és a fájl állapotjelzőit.

Szintaxis:



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

Vegye figyelembe, hogy ez a program nem fog futni az online fordítóprogramban, mivel magában foglalja egy fájl megnyitását és írását.

Magyarázat:

Az open() a file_desc fájlleírót adja vissza a 'dup.txt' fájlnak. A file_desc használható néhány fájlművelet végrehajtására a „dup.txt” fájllal. A dup() rendszerhívás után létrejön a file_desc másolata copy_desc. Ez a másolat bizonyos fájlműveletek végrehajtására is használható ugyanazzal a „dup.txt” fájllal. Két írási művelet után az egyik a file_desc, a másik a copy_desc fájl szerkesztése, azaz a 'dup.txt'. A kód futtatása előtt Legyen a „dup.txt” fájl az írási művelet előtt az alábbiak szerint:

dup() és dup2() Linux rendszerhívás

A fent látható C program futtatása után a „dup.txt” fájl az alábbiak szerint jelenik meg:

dup() és dup2() Linux rendszerhívás

dup2()

A dup2() rendszerhívás hasonló a dup()-hoz, de az alapvető különbség közöttük az, hogy a legalacsonyabb számú nem használt fájlleíró helyett a felhasználó által megadott leírószámot használja.

Szintaxis:

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

Fontos pontok:

  • Szerelje be az unistd.h fejlécfájlt a dup() és dup2() rendszerhívás használatához.
  • Ha a newfd leíró korábban nyitva volt, akkor az újrafelhasználás előtt csendben bezáródik.
  • Ha az oldfd nem érvényes fájlleíró, akkor a hívás meghiúsul, és a newfd nem záródik be.
  • Ha az oldfd egy érvényes fájlleíró, és a newfd értéke megegyezik az oldfd értékével, akkor a dup2() nem csinál semmit, és a newfd értéket adja vissza.

A dup2() rendszerhívás trükkös használata:

A dup2()-hez hasonlóan a newfd helyére tetszőleges fájlleíró tehető. Az alábbiakban egy C megvalósítás látható, amelyben a szabványos kimenet (stdout) fájlleíróját használják. Ez arra készteti, hogy az összes printf() utasítás a régi fájlleíró által hivatkozott fájlba kerüljön.

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

Ez látható az alábbi ábrán: Legyen a dup2() művelet előtti 'tricky.txt' fájl az alábbiak szerint:

dup() és dup2() Linux rendszerhívás

A fent látható C program futtatása után a „tricky.txt” fájl az alábbiak szerint jelenik meg:

dup() és dup2() Linux rendszerhívás Kvíz létrehozása