logo

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

дуп ()

Системното извикване dup() създава копие на файлов дескриптор.

  • Той използва неизползвания дескриптор с най-нисък номер за новия дескриптор.
  • Ако копието е създадено успешно, дескрипторите на оригиналния и копирания файл могат да се използват взаимозаменяемо.
  • И двете препращат към едно и също описание на отворен файл и по този начин споделят флагове за отместване на файла и състояние на файла.

Синтаксис:



сортиране на arraylist java
    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 filen');    // 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.txtn' 46);    write(file_desc'This will also be output to the file named dup.txtn' 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' преди операцията за запис да бъде както е показано по-долу:

разлика между масив и arraylist
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.txtn');   return 0; } 

Това може да се види на фигурата, показана по-долу: Нека файлът 'tricky.txt' преди операцията dup2() да бъде както е показано по-долу:

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

След стартиране на C програмата, показана по-горе, файлът "tricky.txt" е както е показано по-долу:

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