Рубрики

dup () и dup2 () системный вызов Linux

DUP ()

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

  • Для нового дескриптора используется неиспользуемый дескриптор с наименьшим номером.
  • Если копия успешно создана, то дескрипторы файла оригинала и копии могут использоваться взаимозаменяемо.
  • Они оба ссылаются на одно и то же описание открытого файла и, таким образом, совместно используют смещение файла и флаги состояния файла.

Синтаксис:

int dup(int oldfd);
oldfd: old file descriptor whose copy is to be created.

// Программа CPP для иллюстрации dup ()
#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>

  

int main()

{

    // open () возвращает дескриптор файла file_desc

    // файл "dup.txt" здесь "

  

    int file_desc = open("dup.txt", O_WRONLY | O_APPEND);

      

    if(file_desc < 0)

        printf("Error opening the file\n");

      

    // dup () создаст копию file_desc как copy_desc

    // тогда оба могут быть использованы взаимозаменяемо.

  

    int copy_desc = dup(file_desc);

          

    // write () запишет данную строку в файл

    // ссылается на дескрипторы файла

  

    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» перед операцией записи будет таким, как показано ниже:

После запуска программы на C, показанной выше, файл «dup.txt» выглядит так:

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 () будут записаны в файл, указанный старым файловым дескриптором.

// Программа CPP для иллюстрации dup2 ()
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>

  

int main()

{

    int file_desc = open("tricky.txt",O_WRONLY | O_APPEND);

      

    // здесь newfd - это файловый дескриптор stdout (т.е. 1)

    dup2(file_desc, 1) ; 

          

    // Все операторы printf будут записаны в файл

    // "tricky.txt"

    printf("I will be printed in the file tricky.txt\n");

      

return 0;

}

Это можно увидеть на рисунке ниже:
Пусть файл «tricky.txt» до операции dup2 () будет таким, как показано ниже:

После запуска программы на C, показанной выше, файл «tricky.txt» выглядит так:

Ссылка: dup (2) — справочная страница по Linux

Эта статья предоставлена МАЖАР ИМАМ ХАН . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

dup () и dup2 () системный вызов Linux

0.00 (0%) 0 votes