ИМЯ
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.
СМОТРИ ТАКЖЕ
ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm [AT] hsys.ru> 1999, Виктор Вислобоков <corochoone [AT] perm.ru> 2003