Каковы правила закрытия файловых дескрипторов после вызова dup / dup2? - PullRequest
2 голосов
/ 20 апреля 2019

Я чувствую, что это тема, которую я принял как должное.В прошлом я буквально закрывал столько файловых дескрипторов «потому что мне сказали».Большую часть времени это работало, но иногда я сталкивался с непредсказуемым поведением.

Итак, я хотел бы спросить - какое правило для закрытия файловых дескрипторов после вызова dup / dup2?

Допустим, я хочу выполнить cat < in > out.

fd[IN] = open("in", O_RDONLY);
saved_stdin = dup(STDIN_FILENO);
dup2(fd[IN], STDIN_FILENO);
close(fd[IN])

fd[OUT] = open("out", O_WRONLY | O_CREAT | O_TRUNC, 0644);
saved_stdout = dup(STDOUT_FILENO);
dup2(fd[OUT], STDOUT_FILENO);
close(fd[OUT])


// Later on when I want to restore stdin and stdout
dup2(saved_stdin, STDIN_FILENO);
close(saved_stdin);
dup2(saved_stdout, STDINOUT_FILENO);
close(saved_stdout);

Это правильно, или я должен закрыть больше файловых дескрипторов?

1 Ответ

1 голос
/ 20 апреля 2019

Правило действительно довольно просто. Для обоих dup() вариантов верно, что:

  • Источник fd остается открытым и газ должен быть закрыт, когда он больше не нужен
    • Дескриптор целевого файла неявно закрыт и заменен копией исходного файла.

Правило действительно довольно простое. Для обоих dup() вариантов верно, что:

  • Источник fd остается открытым и газ должен быть закрыт, когда он больше не нужен.

  • Дескриптор целевого файла неявно закрыт (всегда неиспользуемый при использовании dup() в отличие от dup2()) и заменяется копией исходного файла.

  • Новый целевой объект должен быть закрыт, когда он больше не нужен.

Источник fd ссылается на дескриптор файла, который должен быть продублирован, а target fd - новый дескриптор файла.

Так что да, ваш код делает необходимые закрытия, но не ненужные.

...