dup (системный вызов) - dup (system call)

редактировать

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

Содержание
  • 1 Определение POSIX библиотеки C
  • 2 dup2 для перенаправления ввода / вывода
  • 3 См. Также
  • 4 Ссылки
Определение POSIX библиотеки C

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

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

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

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

dup2 для перенаправления ввода / вывода

Оболочки 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); }
См. Также
Ссылки
  • Расширенное программирование в среде UNIX, У. Ричард Стивенс ISBN 81-7808-096-6
Последняя правка сделана 2021-05-18 06:33:11
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте