В Unix-подобных операционных системах, dup (сокращение от «duplicate») и системные вызовы dup2 создают копию заданного файлового дескриптора . Этот новый дескриптор на самом деле ведет себя не как копия, а как псевдоним старого.
dup и dup2 вызовы стандартизированы спецификацией POSIX.
int dup (int oldfd); int dup2 (int oldfd, int newfd);
Первый выделяет первый доступный дескриптор, как и open () ; альтернативный способ скопировать файловый дескриптор в неуказанное место - это системный вызов fcntl с командой F_DUPFD
.
Последний помещает копию в newfd. Если newfd открыт, сначала он закрыт.
Оболочки Unix используют dup2 для ввода / вывода перенаправления. Наряду с pipe()
, это инструмент, на который полагается Unix pipe.
В следующем примере используются pipe ()
и dup ()
для соединения двух отдельных процессов (program1 и program2) с помощью каналов Unix :
#include#include #include / * прототипы функций * / void die (const char *); int main (int argc, char ** argv) {int pdes [2]; pid_t child; if (pipe (pdes) == -1) die ("pipe ()"); ребенок = вилка (); если (ребенок == (pid_t) (- 1)) die ("fork ()"); / * ошибка вилки * / if (child == (pid_t) 0) {/ * дочерний процесс * / close (1); / * закрыть стандартный вывод * / if (dup (pdes [1]) == -1) die ("dup ()"); / * теперь stdout и pdes [1] эквивалентны (dup возвращает самый низкий свободный дескриптор) * / if ((execlp ("program1", "program1", "arg1", NULL)) == -1) die ("execlp () "); _exit (EXIT_SUCCESS); } else {/ * родительский процесс * / close (0); / * закрыть стандартный ввод * / if (dup (pdes [0]) == -1) die ("dup ()"); / * теперь stdin и pdes [0] эквивалентны (dup возвращает самый низкий свободный дескриптор) * / if ((execlp ("program2", "program2", "arg1", NULL)) == -1) die ("execlp () "); выход (EXIT_SUCCESS); } return 0; } void die (const char * msg) {ошибка (сообщение); выход (EXIT_FAILURE); }