11.5.3. Дублирование файловых дескрипторов

11.5.3. Дублирование файловых дескрипторов

Иногда процессам требуется создать новый файловый дескриптор, который ссылается на ранее открытый файл. Командные оболочки используют эту функциональность для перенаправления стандартного ввода, вывода и потока ошибок по запросу пользователя. Если процессу не важно, какой файловый дескриптор будет использован для новой ссылки, он должен использовать dup().

#include <unistd.h>

int dup(int oldfd);

dup() возвращает файловый дескриптор, который ссылается на тот же inode, что и oldfd, или -1 в случае ошибки, oldfd остается корректным дескриптором, по-прежнему ссылающимся на исходный файл. Новый файловый дескриптор — это всегда наименьший доступный файловый дескриптор. Если процессу нужно получить новый файловый дескриптор с определенным значением (например, 0, чтобы перенаправить стандартный ввод), то он должен использовать dup2().

#include <unistd.h>

int dup2(int oldfd, int newfd);

Если newfd ссылается на уже открытый дескриптор, то он закрывается. Если вызов завершен успешно, он возвращает новый файловый дескриптор и newfd ссылается на тот же файл, что oldfd. Системный вызов fcntl() представляет почти ту же функциональность командой F_DUPFD. Первый аргумент — fd — это уже открытый файловый дескриптор. Новый файловый дескриптор — это первый доступный дескриптор, равный или больший, чем значение последнего аргумента fcntl(). (В этом состоит отличие от работы dup2().) Вы можете реализовать dup2() через fcntl() следующим образом.

int dup2(int oldfd, int newfd) {

 close(newfd); /* ensure new fd is available */

 return fcntl(oldfd, F_DUPFD, newfd);

}

Создание двух файловых дескрипторов, ссылающихся на один и тот же файл — это не то же самое, что открытие файла дважды. Почти все атрибуты дублированных дескрипторов разделяются: они разделяют текущую позицию, режим доступа и блокировки. (Все это записывается в файловой структуре[50], которая создается при каждом открытии файла. Файловый дескриптор ссылается на файловую структуру, и дескриптор, возвращенный dup(), ссылается на одну и ту же структуру.) Единственный атрибут, который может независимо управляться в этих двух дескрипторах — это состояние "закрыть при выполнении". После того, как процесс вызывает fork(), то файлы, открытые в родительском процессе, наследуются дочерним, и эти пары файловых дескрипторов (один в родительском процессе, другой — в дочернем) ведут себя так, будто файловые дескрипторы были дублированы с текущей позицией и другими разделенными атрибутами[51].

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Копирование и дублирование объектов

Из книги Adobe InDesign CS3 автора Завгородний Владимир

Копирование и дублирование объектов При работе часто требуется создать копию объекта – для сравнения, для подстраховки (запасную копию) или же если просто нужно несколько одинаковых объектов. В Adobe InDesign существуют разные способы дублировния объектов.Прежде всего, даже


Дублирование и объединение слоев

Из книги Photoshop CS3: Обучающий курс автора Тимофеев Сергей Михайлович

Дублирование и объединение слоев Дублирование слоев – это самостоятельная операция, позволяющая получить полноценную копию указанного слоя. Любой слой может быть продублирован. То есть мы можем создать слой, являющийся точной копией какого-либо из уже существующих.Для


Глава 22 Дублирование данных

Из книги Новейший самоучитель работы на компьютере автора Белунцов Валерий

Глава 22 Дублирование данных Современные носители информации обладают высокой надежностью, однако нельзя быть полностью застрахованным от возможных сбоев оборудования. Проблемы с программами, даже операционными системами можно решить путем их переустановки, но если


15.8. Передача дескрипторов

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

15.8. Передача дескрипторов Когда мы говорим о передаче открытого дескриптора от одного процесса другому, обычно подразумевается одно из двух:? наследование всех открытых дескрипторов родительского процесса дочерним после вызова fork;? сохранение открытых дескрипторов при


Дублирование дескрипторов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Дублирование дескрипторов Родительскому и дочернему процессам может требоваться различный доступ к объекту, идентифицируемому дескриптором, который наследует дочерний процесс. Кроме того, процессу вместо псевдодескриптора, получаемого с помощью функции GetModuleFileName или


22.3.7. Закрытие файловых дескрипторов

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

22.3.7. Закрытие файловых дескрипторов В системах Linux и Unix файловые дескрипторы, как правило, наследуются через системные вызовы exec() (и всегда наследуются через fork() и vfork()). В большинстве случаев такое поведение нежелательно, поскольку только разделяться должны только stdin,


9.6.2.2. Переопределение дескрипторов (handle)

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

9.6.2.2. Переопределение дескрипторов (handle) Когда программа начинает выполняться, пять дескрипторов (handle), соответствующих стандартным вводу, выводу, выводу сообщений об ошибках, порту и устройству печати, уже назначены. Пользователь может использовать значения этих


10.5. Дублирование данных: введение в RAID

Из книги Linux программирование в примерах автора Роббинс Арнольд

10.5. Дублирование данных: введение в RAID Идея надежности хранения данных волновала, волнует и будет волновать не одно поколение системных администраторов и пользователей. Используемые ОС Linux файловые системы ext2 и ext3 обладают достаточной степенью надежности, но зачастую


9.1.1.2. Разделение дескрипторов файлов

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

9.1.1.2. Разделение дескрипторов файлов Атрибуты, которые порожденный процесс наследует от родителя, устанавливаются в те же значения, которые были в родительском процессе в момент выполнения fork(). Однако, с этого момента два процесса продолжают идти собственными путями


15.7. Передача дескрипторов

Из книги автора

15.7. Передача дескрипторов Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции fork.2. Все дескрипторы


Дублирование, аффилиаты, ошибки

Из книги автора

Дублирование, аффилиаты, ошибки Анализ содержания поддоменов. На поддоменах может располагаться что угодно: копия сайта, спамный контент, вирусы. Например, на поддомене может располагаться архивная версия форума, которая уже не работает и поэтому не обновляется.