dup() i dup2() Linux sistemski poziv

dup() i dup2() Linux sistemski poziv

dup()

Sistemski poziv dup() stvara kopiju deskriptora datoteke.

  • Za novi deskriptor koristi se neiskorišteni deskriptor s najmanjim brojem.
  • Ako je kopija uspješno stvorena, deskriptori datoteke izvornika i kopije mogu se koristiti naizmjenično.
  • Oba se odnose na isti opis otvorene datoteke i stoga dijele oznake pomaka datoteke i statusa datoteke.

Sintaksa:

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

Imajte na umu da se ovaj program neće pokrenuti u online kompajleru jer uključuje otvaranje datoteke i pisanje po njoj.

Obrazloženje:

Open() vraća deskriptor datoteke file_desc u datoteku pod nazivom 'dup.txt'. file_desc se može koristiti za izvođenje neke operacije datoteke s datotekom 'dup.txt'. Nakon korištenja dup() sistemskog poziva kreira se kopija file_desc copy_desc. Ova se kopija također može koristiti za izvođenje nekih operacija datoteka s istom datotekom 'dup.txt'. Nakon dvije operacije pisanja, jedna s file_desc i druga s copy_desc ista se datoteka uređuje, tj. 'dup.txt'. Prije pokretanja koda Neka datoteka 'dup.txt' prije operacije pisanja bude kao što je prikazano u nastavku:

dup() i dup2() Linux sistemski poziv

Nakon pokretanja C programa prikazanog gore, datoteka 'dup.txt' je kao što je prikazano u nastavku:

dup() i dup2() Linux sistemski poziv

dup2()

Sistemski poziv dup2() sličan je dup(), ali osnovna razlika između njih je da umjesto korištenja neiskorištenog deskriptora datoteke s najmanjim brojem koristi broj deskriptora koji je odredio korisnik.

Sintaksa:

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

Važne točke:

  • Uključite datoteku zaglavlja unistd.h za korištenje dup() i dup2() sistemskog poziva.
  • Ako je deskriptor newfd prethodno bio otvoren, tiho se zatvara prije ponovne upotrebe.
  • Ako oldfd nije važeći deskriptor datoteke tada poziv ne uspijeva i newfd se ne zatvara.
  • Ako je oldfd važeći deskriptor datoteke i newfd ima istu vrijednost kao oldfd tada dup2() ne radi ništa i vraća newfd.

Varljiva upotreba dup2() sistemskog poziva:

Kao u dup2() umjesto newfd može se staviti bilo koji deskriptor datoteke. Ispod je C implementacija u kojoj se koristi deskriptor datoteke standardnog izlaza (stdout). Ovo će dovesti do toga da se sve izjave printf() zapišu u datoteku koju upućuje stari deskriptor datoteke.

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 se može vidjeti na donjoj slici: Neka datoteka 'tricky.txt' prije operacije dup2() bude kao što je prikazano u nastavku:

dup() i dup2() Linux sistemski poziv

Nakon pokretanja C programa prikazanog gore, datoteka 'tricky.txt' je kao što je prikazano u nastavku:

dup() i dup2() Linux sistemski poziv Napravi kviz