dup() a dup2() systémové volanie Linuxu

dup() a dup2() systémové volanie Linuxu

dup()

Systémové volanie dup() vytvorí kópiu deskriptora súboru.

  • Pre nový deskriptor používa nepoužitý deskriptor s najnižším číslom.
  • Ak sa kópia úspešne vytvorí, potom sa deskriptory súboru originálu a kópie môžu používať zameniteľne.
  • Obidve odkazujú na rovnaký popis otvoreného súboru, a teda zdieľajú príznaky posunu súboru a stavu súboru.

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šimnite si, že tento program sa nespustí v online kompilátore, pretože zahŕňa otvorenie súboru a zápis doň.

Vysvetlenie:

Open() vracia deskriptor súboru file_desc do súboru s názvom 'dup.txt'. file_desc možno použiť na vykonanie niektorých operácií so súborom 'dup.txt'. Po použití systémového volania dup() sa vytvorí kópia súboru_desc copy_desc. Túto kópiu je možné použiť aj na vykonanie niektorých operácií so súborom s rovnakým súborom 'dup.txt'. Po dvoch operáciách zápisu, jedna s file_desc a druhá s copy_desc sa upraví ten istý súbor, t.j. 'dup.txt'. Pred spustením kódu Nechajte súbor 'dup.txt' pred operáciou zápisu vyzerať takto:

dup() a dup2() systémové volanie Linuxu

Po spustení programu C zobrazenom nad súborom 'dup.txt' je znázornené nižšie:

dup() a dup2() systémové volanie Linuxu

dup2()

Systémové volanie dup2() je podobné ako dup(), ale základný rozdiel medzi nimi je v tom, že namiesto použitia najnižšieho nepoužitého deskriptora súboru používa číslo deskriptora určené používateľom.

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ý súbor unistd.h na použitie systémového volania dup() a dup2().
  • Ak bol deskriptor newfd predtým otvorený, pred opätovným použitím sa ticho zatvorí.
  • Ak oldfd nie je platným deskriptorom súboru, volanie zlyhá a newfd sa neuzavrie.
  • Ak je oldfd platným deskriptorom súboru a newfd má rovnakú hodnotu ako oldfd, potom dup2() neurobí nič a vráti newfd.

Zložité použitie systémového volania dup2():

Rovnako ako v prípade dup2() je možné namiesto newfd vložiť ľubovoľný deskriptor súboru. Nižšie je implementácia C, v ktorej sa používa deskriptor súboru štandardného výstupu (stdout). To povedie k zápisu všetkých príkazov printf() do súboru, na ktorý odkazuje starý deskriptor súboru.

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

Toto je možné vidieť na obrázku nižšie: Nech je súbor 'tricky.txt' pred operáciou dup2() taký, ako je znázornené nižšie:

dup() a dup2() systémové volanie Linuxu

Po spustení programu C zobrazenom nad súborom 'tricky.txt' je to znázornené nižšie:

dup() a dup2() systémové volanie Linuxu Vytvoriť kvíz

Mohlo By Sa Vám Páčiť