dup2 / dup - зачем мне нужно дублировать файловый дескриптор?



Я пытаюсь понять использование dup2 и dup.



С главной страницы:



DESCRIPTION

dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.

The two descriptors do not share the close-on-exec flag, however.

dup uses the lowest-numbered unused descriptor for the new descriptor.

dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.

RETURN VALUE

dup and dup2 return the new descriptor, or -1 if an error occurred
(in which case, errno is set appropriately).


зачем мне нужен этот системный вызов? какой смысл дублировать файловый дескриптор?



если у меня есть файловый дескриптор, зачем мне его копировать?



Я был бы признателен, если бы вы могли объяснить и приведите мне пример, где dup2/ это.



спасибо

1002   4  

4 ответов:

системный вызов dup дублирует существующий дескриптор файла, возвращая новый, который относится к тому же базовому объекту ввода-вывода.

Dup позволяет оболочкам реализовывать такие команды:

ls existing-file non-existing-file > tmp1  2>&1

2>&1 сообщает оболочке, чтобы дать команде файловый дескриптор 2, который является дубликатом дескриптора 1. (т. е. stderr & stdout указывают на тот же fd).
Теперь сообщение об ошибке для вызова ls on несуществующий файл и правильный выход из ls on существующий файл показать в tmp1.

в следующем примере кода выполняется программа wc со стандартным подключенным входом к считанному концу трубы.

int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
    close(STDIN); //CHILD CLOSING stdin
    dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
    close(p[STDIN]);
    close(p[STDOUT]);
    exec("/bin/wc", argv);
} else {
    write(p[STDOUT], "hello world\n", 12);
    close(p[STDIN]);
    close(p[STDOUT]);
}

ребенок дублирует конец чтения на файловый дескриптор 0, закрывает файл de скрипторы в p и execs wc. Когда wc читает от своего стандартного входного сигнала, он читает от труба.
Вот как трубы реализуются с помощью dup, Ну что одно использование dup теперь вы используете труба, чтобы построить что-то еще, это красота системных вызовов,вы строите одну вещь за другой , используя инструменты, которые уже есть, эти инструменты были построены с использованием чего-то еще и так далее .. В конце системные вызовы-это самые основные инструменты, которые вы получаете в kernel

Ура :)

еще одна причина для дублирования дескриптора файла, используя его с fdopen. fclose закрывает файловый дескриптор, который был передан в fdopen, Так что если вы не хотите, чтобы исходный файловый дескриптор был закрыт, вы должны дублировать его с dup первый.

некоторые моменты, связанные с dup / dup2 можно отметить, пожалуйста

dup/dup2-технически цель состоит в том, чтобы поделиться одной записью таблицы файлов внутри один процесс разными ручками. ( Если мы разветвляем дескриптор дублируется по умолчанию в дочернем процессе и запись таблицы файлов также является общей).

это означает, что мы можем иметь более одного дескриптора файла, имеющего возможно, разные атрибуты для одной записи таблицы открытых файлов, используя функция dup / dup2.

(хотя в настоящее время только флаг FD_CLOEXEC является единственным атрибутом для файлового дескриптора).

http://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html

dup(fd) is equivalent to fcntl(fd, F_DUPFD, 0);

dup2(fildes, fildes2); is equivalent to 

   close(fildes2);
   fcntl(fildes, F_DUPFD, fildes2);

различия (для последнего) - кроме некоторого значения errno beteen dup2 и fcntl close, за которым следует fcntl, может повысить условия гонки, так как задействованы два вызова функций.

детали можно проверить от http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html

пример использования -

один интересный пример при реализации управления заданиями в оболочке, где использование dup / dup2 можно увидеть ..в ссылке ниже

http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs

dup используется для перенаправления вывода из процесса.

например, если вы хотите сохранить вывод из процесса, вы дублируете вывод (fd=1), перенаправляете дублированный fd в файл, затем разветвляете и выполняете процесс, и когда процесс заканчивается, вы снова перенаправляете сохраненный fd на вывод.

Comments

    Ничего не найдено.