dup() і dup2() системний виклик Linux

dup() і dup2() системний виклик Linux

dup()

Системний виклик dup() створює копію дескриптора файлу.

  • Він використовує невикористаний дескриптор із найменшим номером для нового дескриптора.
  • Якщо копію створено успішно, дескриптори файлів оригіналу та копії можна використовувати як взаємозамінні.
  • Обидва вони посилаються на один і той самий опис відкритого файлу і, таким чином, спільно використовують позначки зміщення файлу та статусу файлу.

Синтаксис:

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

Зауважте, що ця програма не працюватиме в онлайн-компіляторі, оскільки включає відкриття файлу та запис у нього.

Пояснення:

Функція open() повертає дескриптор файлу file_desc до файлу з назвою «dup.txt». file_desc можна використовувати для виконання деяких файлових операцій із файлом 'dup.txt'. Після використання системного виклику dup() створюється копія file_desc copy_desc. Ця копія також може бути використана для виконання деяких файлових операцій з тим самим файлом 'dup.txt'. Після двох операцій запису, однієї з file_desc, а іншої з copy_desc, той самий файл редагується, тобто «dup.txt». Перед виконанням коду Нехай файл 'dup.txt' перед операцією запису буде таким, як показано нижче:

dup() і dup2() системний виклик Linux

Після запуску програми C, показаної вище, файл 'dup.txt' виглядає так, як показано нижче:

dup() і dup2() системний виклик Linux

dup2()

Системний виклик dup2() подібний до dup(), але основна відмінність між ними полягає в тому, що замість використання невикористаного дескриптора файлу з найменшим номером він використовує номер дескриптора, указаний користувачем.

Синтаксис:

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

Важливі моменти:

  • Включіть файл заголовка unistd.h для використання системних викликів dup() і dup2().
  • Якщо дескриптор newfd був раніше відкритий, він мовчки закривається перед повторним використанням.
  • Якщо oldfd не є дійсним файловим дескриптором, виклик не вдається, і newfd не закривається.
  • Якщо oldfd є дійсним файловим дескриптором і newfd має те саме значення, що й oldfd, тоді dup2() нічого не робить і повертає newfd.

Складне використання системного виклику dup2():

Як і в dup2() замість newfd можна поставити будь-який файловий дескриптор. Нижче наведено реалізацію C, у якій використовується файловий дескриптор стандартного виведення (stdout). Це призведе до того, що всі оператори printf() будуть записані у файл, на який посилається старий файловий дескриптор.

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

Це можна побачити на малюнку нижче: Нехай файл 'tricky.txt' перед операцією dup2() буде таким, як показано нижче:

dup() і dup2() системний виклик Linux

Після запуску програми C, показаної вище, файл 'tricky.txt' виглядає так, як показано нижче:

dup() і dup2() системний виклик Linux Створіть вікторину