Добавить в цитаты Настройки чтения

Страница 234 из 324

<b>#include &lt;unistd.h&gt;</b>

<b>int dup(int file_descriptor);</b>

<b>int dup2(int file_descriptor_one, int file_descriptor_two);</b>

Назначение вызова dup — открыть новый дескриптор файла, немного похоже на то, как это делает вызов open. Разница в том, что файловый дескриптор, созданный dup, ссылается на тот же файл (или канал), что и существующий файловый дескриптор. В случае вызова dup новый файловый дескриптор всегда имеет самый маленький доступный номер, а в случае dup2 — первый доступный дескриптор, больший чем значение параметра file_descriptor_two.

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

Итак, как же dup помогает в обмене данными между процессами? Хитрость кроется в знании того, что дескриптор стандартного файла ввода всегда 0 и что dup всегда возвращает новый файловый дескриптор, применяя наименьший доступный номер. Сначала закрыв дескриптор 0, а затем вызвав dup, вы получите новый файловый дескриптор с номером 0. Поскольку новый файловый дескриптор — это дубликат существующего, стандартный ввод изменится и получит доступ к файлу или каналу, файловый дескриптор которого вы передали в функцию dup. В результате вы создадите два файловых дескриптора, которые ссылаются на один и тот же файл или канал и один из них будет стандартным вводом.

Легче всего понять, что происходит, когда вы закрываете файловый дескриптор 0 и затем вызываете dup, если рассмотреть состояние первых четырех файловых дескрипторов, изменяющихся последовательно друг за другом (табл. 13.1).

Таблица 13.1