Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В Unix-подобных операционных системах системные вызовы dup (сокращение от «duplicate») и dup2 создают копию заданного файлового дескриптора . Этот новый дескриптор на самом деле ведет себя не как копия, а как псевдоним старого.

Определение POSIX библиотеки C [ править ]

Вызовы dup и dup2 стандартизированы спецификацией POSIX . [1]

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

Первый выделяет первый доступный дескриптор, как и open () ; альтернативный способ скопировать файловый дескриптор в неопределенное место - это системный вызов fcntl с F_DUPFDкомандой.

Последний помещает копию в файл newfd. Если newfd открыт, он сначала закрывается .

dup2 для перенаправления ввода / вывода [ править ]

Оболочки Unix используют dup2 для перенаправления ввода / вывода . Наряду с этим , это инструмент, на который полагаются конвейеры Unix .pipe()

В следующем примере используется pipe()и dup()для соединения двух отдельных процессов ( program1 и program2 ) с помощью каналов Unix :

#include  <stdio.h>#include  <stdlib.h>#include  <unistd.h>/ * прототипы функций * / 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 )  {  / * дочерний процесс * / закрыть ( 1 );  / * закрываем стандартный вывод * /  если ( dup ( pdes [ 1 ])  ==  -1 )  die ( "dup ()" );  / * теперь stdout и pdes [1] эквивалентны (dup возвращает самый низкий свободный дескриптор) * / если (( execlp ( "программа1" ,  "программа1" ,  "аргумент1" ,  NULL ))  ==  -1 )  die ( "execlp ()" );_exit ( EXIT_SUCCESS ); }  else  {  / * родительский процесс * / закрыть ( 0 );  / * закрываем стандартный ввод * /  если ( dup ( pdes [ 0 ])  ==  -1 )  die ( "dup ()" ); / * теперь stdin и pdes [0] эквивалентны (dup возвращает самый низкий свободный дескриптор) * / если (( execlp ( "программа2" ,  "программа2" ,  "аргумент1" ,  NULL ))  ==  -1 )  die ( "execlp ()" );выход ( EXIT_SUCCESS ); } возврат  0 ; }void  die ( const  char  * msg )  { ошибка ( сообщение ); выход ( EXIT_FAILURE ); }

См. Также [ править ]

Ссылки [ править ]

  1. ^ "dup, dup2" . opengroup.org .
  • Расширенное программирование в среде UNIX У. Ричард Стивенс ISBN 81-7808-096-6