dup() a dup2() systémové volání Linuxu

dup() a dup2() systémové volání Linuxu

dup()

Systémové volání dup() vytvoří kopii deskriptoru souboru.

  • Pro nový deskriptor používá nepoužitý deskriptor s nejnižším číslem.
  • Pokud je kopie úspěšně vytvořena, lze deskriptory původního a kopírovaného souboru používat zaměnitelně.
  • Oba odkazují na stejný popis otevřeného souboru, a tak sdílejí offset souboru a příznaky stavu souboru.

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

Všimněte si, že tento program se nespustí v online kompilátoru, protože zahrnuje otevření souboru a zápis do něj.

Vysvětlení:

Open() vrací deskriptor souboru file_desc do souboru s názvem 'dup.txt'. file_desc lze použít k provedení některých operací se souborem 'dup.txt'. Po použití systémového volání dup() se vytvoří kopie file_desc copy_desc. Tuto kopii lze také použít k provedení některých operací se souborem se stejným souborem 'dup.txt'. Po dvou operacích zápisu, jedna s file_desc a druhá s copy_desc se upraví stejný soubor, tj. 'dup.txt'. Před spuštěním kódu Nechte soubor 'dup.txt' před operací zápisu vypadat následovně:

dup() a dup2() systémové volání Linuxu

Po spuštění programu C zobrazeného nad souborem 'dup.txt' vypadá takto:

dup() a dup2() systémové volání Linuxu

dup2()

Systémové volání dup2() je podobné jako dup(), ale základní rozdíl mezi nimi je v tom, že namísto použití nejnižšího nepoužitého deskriptoru souboru používá číslo deskriptoru určené uživatelem.

Syntax:

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

Důležité body:

  • Zahrňte hlavičkový soubor unistd.h pro použití systémového volání dup() a dup2().
  • Pokud byl deskriptor newfd dříve otevřený, je před opětovným použitím tiše uzavřen.
  • Pokud oldfd není platným deskriptorem souboru, pak se volání nezdaří a newfd se neuzavře.
  • Pokud je oldfd platným deskriptorem souboru a newfd má stejnou hodnotu jako oldfd, pak dup2() nedělá nic a vrací newfd.

Záludné použití systémového volání dup2():

Stejně jako v dup2() lze místo newfd vložit libovolný deskriptor souboru. Níže je implementace C, ve které je použit deskriptor souboru standardního výstupu (stdout). To povede k tomu, že všechny příkazy printf() budou zapsány do souboru odkazovaného starým deskriptorem souboru.

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

To je vidět na obrázku níže: Nechť soubor 'tricky.txt' před operací dup2() vypadá následovně:

dup() a dup2() systémové volání Linuxu

Po spuštění programu C zobrazeném nad souborem 'tricky.txt' je znázorněno níže:

dup() a dup2() systémové volání Linuxu Vytvořit kvíz