DUP(2)

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

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

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

#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <fcntl.h>              /* Определение констант O_* */
#include <unistd.h>

int dup3(int oldfd, int newfd, int flags);

ОПИСАНИЕ
Эти системные вызовы создают копию файлового дескриптора oldfd. Для нового дескриптора dup() использует самый маленький свободный номер. dup2() делает newfd копией oldfd, предварительно закрывая newfd, если нужно. Следует отметить, что:

*   Если oldfd является некорректным файловым дескриптором, то вызов завершается с ошибкой, а newfd не закрывается.

*   Если oldfd является корректным файловым дескриптором, а номер newfd совпадает с oldfd, то dup2() не делает ничего и возвращает значение newfd.

После успешного завершения из одного из этих системных вызовов старый и новый файловые дескрипторы являются взаимозаменяемыми. Они указывают на одно и то же открытое файловое описание (см. open(2)) и поэтому имеют общее файловое смещение и флаги состояния файла; например, если файловое смещение изменить с помощью lseek(2) через один из дескрипторов, то смещение изменится и для другого. Эти два дескриптора имеют различные флаги дескриптора файла (флаг close-on-exec). Флаг close-on-exec (FD_CLOEXEC; см. fcntl(2)) у копии дескриптора сбрасывается. dup3() похож на dup2(). Отличия заключаются в следующем:

*   Вызывающий может принудительно установить флаг close-on-exec flag у нового файлового дескриптора, указав O_CLOEXEC в flags. Зачем это может быть нужно смотрите в open(2).

*   Если oldfd равно newfd, то dup3() выдает ошибку EINVAL.

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

ОШИБКИ

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

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

EINTR
    Вызов dup2() или dup3() был прерван каким-либо сигналом. Смотрите signal(7).

EINVAL
    (dup3()) flags содержит некорректное значение. Или oldfd было равно newfd.

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

ВЕРСИИ
dup3() был добавлен в Linux версии 2.6.27; поддержка в glibc доступна с версии 2.9.

СООТВЕТСТВИЕ СТАНДАРТАМ
dup(), dup2(): SVr4, 4.3BSD, POSIX.1-2001. dup3() есть только в Linux.

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

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