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.