Эта статья требует дополнительных ссылок для проверки . ( март 2012 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
В 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 для перенаправления ввода / вывода [ править ]
Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( Март 2012 г. ) |
Оболочки 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 ); }
См. Также [ править ]
- Дескриптор файла - как он работает и другие функции, связанные с открытием
Ссылки [ править ]
- ^ "dup, dup2" . opengroup.org .
- Расширенное программирование в среде UNIX У. Ричард Стивенс ISBN 81-7808-096-6