Домашняя работа dup2 функция

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

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

Это говорит,

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

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

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

2 ответа

Если 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: http://linux.die.net/man/2/dup2

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

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

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

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

Удачи!

Другие вопросы по тегам