Jump to content

дублировать (системный вызов)

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

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

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

Вызовы dup и dup2 стандартизированы спецификацией POSIX . [1] Подобно (следуя логике) указателям, новое описание файла является просто псевдонимом старого, причем оба файловых дескриптора могут использоваться взаимозаменяемо. Оба файловых дескриптора в системном вызове dup() ссылаются на одно и то же описание открытого файла, что означает, что они используют совместное смещение файла и флаги состояния файла; Подобно, но не идентично логике, используемой в указателях, поверхностном или глубоком копировании или ссылках , изменения смещения в одном из файловых дескрипторов изменяют его для другого файлового дескриптора. При использовании dup() два файловых дескриптора не используют одни и те же флаги файловых дескрипторов . В вызывающем процессе в качестве нового номера файлового дескриптора будет использоваться неиспользуемый файловый дескриптор с наименьшим номером. dup2() При использовании системного вызова он выполняет ту же задачу, что и dup(), за исключением использования номера дескриптора файла, указанного в переменной newfd вызова, при этом newfd настраивается для ссылки на описание файла oldfd. Последний системный вызов в этом семействе функций — dup3(), который аналогичен dup2(), за исключением того, что если oldfd равен newfd, системный вызов завершается с ошибкой EINVAL, и вызывающая сторона может принудительно установить флаг закрытия при выполнении. указав O_CLOEXEC в флагах. [2] dup3() был официально добавлен в ​​Linux ядро версии 2.6.27 (поддержка glibc доступна в версии 2.9 и выше).

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

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

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

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/* function prototypes */
void die(const char*);
 
int main(int argc, char **argv) {
	int pdes[2];
	pid_t child;
 
	if(pipe(pdes) == -1)
		die("pipe()");
 
	child = fork();
	if(child == (pid_t)(-1))
        	die("fork()"); /* fork failed */
 
	if(child == (pid_t)0) {
        	/* child process */

        	close(1);       /* close stdout */
        	
        	if(dup(pdes[1]) == -1)
        		die("dup()");
        	
        	/* now stdout and pdes[1] are equivalent (dup returns lowest free descriptor) */

        	if((execlp("program1", "program1", "arg1", NULL)) == -1)
        		die("execlp()");

		_exit(EXIT_SUCCESS);
	} else {
        	/* parent process */

        	close(0);       /* close stdin */
        	
        	if(dup(pdes[0]) == -1)
        		die("dup()");

        	/* now stdin and pdes[0] are equivalent (dup returns lowest free descriptor) */

        	if((execlp("program2", "program2", "arg1", NULL)) == -1)
        		die("execlp()");

		exit(EXIT_SUCCESS);
	}
 
	return 0;
}

void die(const char *msg) {
	perror(msg);
	exit(EXIT_FAILURE);
}

См. также

[ редактировать ]
  1. ^ "дуп, дуп2" . opengroup.org .
  2. ^ «Страницы руководства Linux» .
  • Продвинутое программирование в среде UNIX, У. Ричард Стивенс ISBN   81-7808-096-6
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 236bdcddc244bb11413e084cd9f27c0f__1694081340
URL1:https://arc.ask3.ru/arc/aa/23/0f/236bdcddc244bb11413e084cd9f27c0f.html
Заголовок, (Title) документа по адресу, URL1:
dup (system call) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)