DUP(2)

ИМЯ
dup, dup2 - создать дубликат файлового дескриптора

ОБЗОР
#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

ОПИСАНИЕ
dup и dup2 создают копию файлового дескриптора oldfd. Старый и новый дескрипторы можно использовать друг вместо друга. Они имеют общие блокировки, указатель позиции в файле и флаги; например, если позиция в файле была изменена с помощью lseek, на одном из дескрипторов, то эта позиция также меняется и на втором. Два дескриптора, однако, каждый имеют свой собственный флаг закрыть-при-exec. dup использует самый маленький свободный номер дескриптора. dup2 делает newfd копией oldfd, закрывая newfd, если требуется.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
dup и dup2 возвращают новый дескриптор или -1, если произошла ошибка (в этом случае errno устанавливается должным образом).

ОШИБКИ

EBADF
    oldfd не является открытым файловым дескриптором, или же newfd находится вне допустимого диапазона файловых дескрипторов.

EMFILE
    Процесс уже открыл максимальное количество файлов и пытается открыть еще один.

EINTR
    Вызов dup2 был прерван каким-либо сигналом.

EBUSY
    (Только в Linux) Может случиться в dup2 во время при условии состязательных вызовов open() и dup().

ВНИМАНИЕ
Ошибка, которую возвращает dup2, отличается от той, что возвращает fcntl(..., F_DUPFD, ...), когда newfd находится вне допустимых пределов. На некоторых системах dup2 также иногда возвращает EINVAL, как F_DUPFD.

ОШИБКИ
Если newfd был открыт, любые ошибки, которые могли бы случиться во время close(), теряются. Осторожный программист не будет использовать dup2 не закрыв сперва newfd .

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4 документирует дополнительные коды ошибки EINTR и ENOLINK. POSIX.1 добавляет EINTR. Ошибка EBUSY является специфичной для Linux.

СМОТРИ ТАКЖЕ
fcntl(2), open(2), close(2).

ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999, Виктор Вислобоков <corochoone@perm.ru> 2003