dup
1. dup.2.man
Manpage of DUP
DUP
Section: Руководство программиста Linux (2)Updated: 2010-09-10
Index Return to Main Contents
ИМЯ
dup, dup2, dup3 - создать дубликат файлового дескриптораОБЗОР
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); #define _GNU_SOURCE /* Смотрите feature_test_macros(7) */ #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.ЗАМЕЧАНИЯ
Ошибка, которую возвращает dup2(), отличается от той, что возвращает fcntl(..., F_DUPFD, ...), когда newfd находится вне допустимых пределов. На некоторых системах dup2() также иногда возвращает EINVAL как F_DUPFD.Если newfd был открыт, то любые ошибки, которые могли бы случиться во время close(2), теряются. Осторожный программист не будет использовать dup2() или dup3() не закрыв сперва newfd.
СМОТРИТЕ ТАКЖЕ
close(2), fcntl(2), open(2)
Index
- ИМЯ
- ОБЗОР
- ОПИСАНИЕ
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- ВЕРСИИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- ЗАМЕЧАНИЯ
- СМОТРИТЕ ТАКЖЕ
This document was created by man2html using the manual pages.
Time: 17:41:36 GMT, May 11, 2012



