Что на самом деле делает dup2 в этом случае? - PullRequest
0 голосов
/ 14 июля 2011

Мне нужно кое-что прояснить: у меня есть такой код:

child_map[0] = fileno(fd[0]);
..
pid = fork();
if(pid == 0)
/* child process*/
dup2(child_map[0], STDIN_FILENO);

Теперь, STDIN_FILENO и child_map [0] будут указывать на один и тот же файловый дескриптор?Будут ли будущие входные данные взяты из файла, на который указывают child_map [0] и STDIN_FILENO?Я думал, что STDIN_FILENO означает стандартный вывод (терминал).

Ответы [ 3 ]

1 голос
/ 14 июля 2011

После dup2(), child_map[0] и STDIN_FILENO по-прежнему будут отдельными файловыми дескрипторами , но они будут ссылаться на то же самое описание открытого файла .Это означает, что если, например, child_map[0] == 5 и STDIN_FILENO == 0, то оба дескриптора файла 5 и 0 останутся открытыми после dup2().

Ссылка на одно и то же средство описания открытого файлачто файловые дескрипторы являются взаимозаменяемыми - они имеют общие атрибуты, такие как текущее смещение файла.Если вы выполните lseek() для одного дескриптора файла, текущее смещение файла будет изменено для обоих.

Чтобы закрыть описание открытого файла, все дескрипторы файлов , которые указывают на него, должны быть закрыты..

Обычно после dup2() выполняется close(child_map[0]), что оставляет открытым только один дескриптор файла.

0 голосов
/ 14 июля 2011

STDIN_FILENO - это stdin, а не stdout. (Там тоже STDOUT_FILENO.) Традиционно первый равен 0, а второй 1.

Этот код использует dup2() для перенаправления дочернего stdin из другого файлового дескриптора, который открылся родительским. (На самом деле это тот же базовый механизм, который используется для перенаправления в оболочках.) Что обычно происходит потом, так это то, что какая-то другая программа, которая читает из ее stdin, является exec ed, поэтому код для нее настроил stdin .

0 голосов
/ 14 июля 2011

Это заставляет все функции, которые читают из stdin, получать свои данные из указанного файлового дескриптора вместо родительского stdin (часто это терминал, но может быть файлом или каналом в зависимости от перенаправления оболочки).

Фактически, именно так оболочка запускает процессы с перенаправленным вводом.

Например,

cat somefile | uniq

uniq стандартный ввод связан с каналом, а не стерминал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...