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

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

Определение POSIX библиотеки C

Вызовы dup и dup2 стандартизированы POSIX Технические характеристики.[1]

int обман (int oldfd);int dup2 (int oldfd, int newfd);

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

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

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

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

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

#включают <stdio.h>#включают <stdlib.h>#включают <unistd.h>/ * прототипы функций * /пустота умереть(const char*); int главный(int argc, char **argv) {	int pdes[2];	pid_t ребенок; 	если(трубка(pdes) == -1)		умереть("трубка()"); 	ребенок = вилка();	если(ребенок == (pid_t)(-1))        	умереть("вилка()"); / * вилка не удалась * / 	если(ребенок == (pid_t)0) {        	/ * дочерний процесс * /        	Закрыть(1);       / * закрываем стандартный вывод * /        	        	если(обман(pdes[1]) == -1)        		умереть("dup ()");        	        	/ * теперь stdout и pdes [1] эквивалентны (dup возвращает самый низкий свободный дескриптор) * /        	если((execlp("программа1", "программа1", "arg1", НОЛЬ)) == -1)        		умереть("execlp ()");		_выход(EXIT_SUCCESS);	} еще {        	/ * родительский процесс * /        	Закрыть(0);       / * закрываем стандартный ввод * /        	        	если(обман(pdes[0]) == -1)        		умереть("dup ()");        	/ * теперь stdin и pdes [0] эквивалентны (dup возвращает самый низкий свободный дескриптор) * /        	если((execlp("программа2", "программа2", "arg1", НОЛЬ)) == -1)        		умереть("execlp ()");		выход(EXIT_SUCCESS);	} 	возвращаться 0;}пустота умереть(const char *сообщение) {	перрор(сообщение);	выход(EXIT_FAILURE);}

Смотрите также

Рекомендации

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