Домашняя работа 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()
функция, но это то, как я бы пошел об этом. Просто внимательно прочитайте эту веб-страницу, чтобы вы знали, как работает функция (любой может проверить правильность информации, проверив еще несколько ссылок).
Удачи!