> Linux Reviews > man >

dup


  1. dup.2.man


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.

dup3() есть только в Linux.  

ЗАМЕЧАНИЯ

Ошибка, которую возвращает 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:15 GMT, October 23, 2013

SVENSKA - SVENSKA - SVENSKA - SVENSKA - ja - nl - pl