домашняя работа dup2 функция - PullRequest
1 голос
/ 29 ноября 2011

У меня вопрос по домашнему заданию со следующим кодом:

dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
if(fd>2)
    close(fd);

Там написано,

"Чтобы понять, зачем нужен тест if, предположим, что fd равно 1, и нарисуйте картинку о том, что происходит с тремя записями дескриптора и соответствующими запись в таблице файлов при каждом вызове dup2. Тогда предположим, что fd равно 3 и нарисуйте та же картина. "

Мне было интересно, смогу ли я получить какую-то помощь в этом, потому что я довольно заблудился.

Может ли кто-нибудь дать мне краткое руководство по этому материалу, потому что мне трудно найти его в своей книге и в Интернете. Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

если fd равно 3, он закроет fds 0, 1, 2, который изначально указывал бы на stdin, stdout, stderr соответственно, и создаст 3 копии fd: 0, 1, 2, все указывающие на тот же пункт назначения, что иfd 3. теперь вам не нужно 3, поэтому вы закрываете его, потому что у вас уже есть 0, 1, 2, указывающие на то, куда указывал 3, и вы больше не планируете использовать 3.

если fdравен 1, он закроет fds 0, 2, который изначально указывал бы на stdin, stderr соответственно, и создал бы 2 копии fd: 0, 2, все указывающие на тот же пункт назначения, что и fd 1 (stdout).теперь вам нужно 1, указывающее на stdout, потому что остальная часть вашей программы планирует использовать 1 в качестве stdout, поэтому вы не закрываете fd в этом случае.

, поэтому вам нужен оператор if, потому что в одном случае вам нужнозакрыть fd, который вы не планируете использовать, а в другом случае вам не нужно закрывать fd, который вы планируете использовать.

man page: http://linux.die.net/man/2/dup2

1 голос
/ 29 ноября 2011

Во-первых, зациклите, что делает функция dup2(), например, http://www.mkssoftware.com/docs/man3/dup2.3.asp. Эта ссылка говорит вам, что dup2() "дублирует дескриптор открытого файла на другой дескриптор файла" и что "В случае успеха, dup2()возвращает неотрицательное целое число, а именно дублированный дескриптор файла, который является наименьшим доступным дескриптором. "

Затем вы захотите нарисовать файловые дескрипторы на листе бумаги (просто нарисуйте fd, 0, 1, 2 на листе бумаги).Это будет начальное состояние файловых дескрипторов, которые вы имеете до первого вызова dup2().То есть у вас есть три файловых дескриптора.

Затем перерисовывайте файловые дескрипторы после каждого вызова dup2().В конце, если fd > 2, вы закрываете один из файловых дескрипторов.

Я не эксперт по функции dup2(), но я бы так и поступил.Просто внимательно прочитайте эту веб-страницу, чтобы вы знали, как работает эта функция (любой может проверить правильность информации, проверив еще несколько ссылок).

Удачи!

...