Scroll to navigation

dup(2) 2007-10-27-16:31 dup(2)

НАЗВА

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 також отримає відповідне значення).

КОДИ ПОМИЛОК


oldfd не являється відкритим дескриптором файлу, або newfd знаходиться поза межами дозволених дескрипторів файлів.

Процес відкрив максимально дозволену кількість дескрипторів файлів і намагається відкрити ще один.

Виклик dup2 було перервано якимось сигналом.

(Тільки для Лінукса) може бути повернутим 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>

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL