Man:Man2/dup.2

Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.

Перейти до: навігація, пошук

Зміст

НАЗВА

dup, dup2 - дублює дескриптор файлу

СТИСЛИЙ ОГЛЯД

#include <unistd.h>

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

ОПИС

dup і dup2 створюють копію дескриптору файлу oldfd. Після успішного завершення dup або dup2, новий і старий дескриптор можуть використовуватись взаємозамінно. Вони спільно використовують ті самі замки (locks), покажчики на позицію файлу і прапорці. Прикладом, якщо позиція одного з файлів-дескрипторів помінялась завдяки lseek, це буде дійсним також і для другого дескриптору.

Два дескриптори не поділяють прапорець close-on-exec (закриття по виконанню), тим не менш.

dup використовує вільний дескриптор з найменшим порядковим номером для нового дескриптору.

dup2 створює newfd як копію oldfd, закриваючи першим newfd, якщо необхідно.

ПОВЕРНЕНЕ ЗНАЧЕННЯ

dup і dup2 повертають новий дескриптор, або -1, якщо виникла якась помилка (у такому випадку, errno також отримає відповідне значення).

КОДИ ПОМИЛОК

EBADF
oldfd не являється відкритим дескриптором файлу, або newfd знаходиться поза межами дозволених дескрипторів файлів.
EMFILE
Процес відкрив максимально дозволену кількість дескрипторів файлів і намагається відкрити ще один.
EINTR
Виклик dup2 було перервано якимось сигналом.
EBUSY
(Тільки для Лінукса) може бути повернутим dup2 під час стану перегону (race condition) з 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 є характерним лише для Лінукса.

ДИВІТЬСЯ ТАКОЖ

fcntl(2), open(2), close(2)


Переклав Віталій Цибуляк <vi@uatech.atspace.com>

Особисті інструменти