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