2014-09-10 6 views
2

В программе C или C++ я могу использовать freopen для перенаправления вывода (то есть дескриптора файла stdout) в другой файл (или для отказа от его повторного открытия файлового дескриптора в/dev/null или другом приемнике).Должен быть закрыт «freopen'ed» stdout?

Вопрос: если я это сделаю, должен ли я заботиться о закрытии дескриптора файла явно до того, как программа завершит выполнение? Зачем? На каких платформах? Что происходит вообще и в этом конкретном случае, если я не закрываю файловый дескриптор?

ответ

4
  1. Должен ли я заботиться о закрытии дескриптора файла в явном виде, прежде чем программа завершает выполнение?

    От freopen(3) man page:

    Функция freopen() открывает файл, имя которого является строка указывает на от файла и связывает поток, на который указывает поток с ним. Исходный поток (если он существует) закрыт.

    Нет, вам не нужно закрывать оригинал FILE *. Скорее всего, вы должны закрыть тот, который вы получили от вызова freopen. BTW - это все переменные FILE *, а не дескрипторы файлов.

  2. Почему?

    Поскольку в документации указано, что вам не нужно.

  3. На каких платформах?

    Любой, который правильно реализует freopen(3), как определено стандартом C.

  4. Что происходит вообще и в этом конкретном случае, если я не закрываю дескриптор файла?

    Операционная система очищает ресурсы, используемые вашей программой, когда ваша программа завершает работу.