dup() и dup2() системно извикване на Linux

dup() и dup2() системно извикване на Linux

дуп ()

Системното извикване 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 Създаване на тест