Из того, что я прочитал, fclose() в основном похож на free() при выделении памяти, но я также читал, что операционная система закроет этот файл для вас и очистит все открытые потоки сразу после его завершения. Я даже протестировал несколько программ без fclose(), и все они работают нормально.
В чем смысл fclose()?
Ответы (2)
Длительному процессу (например, базе данных или веб-браузеру) может потребоваться открыть много файлов за время своего существования; хранение неиспользуемых файлов открытыми приводит к трате ресурсов и потенциально блокирует использование файлов другими процессами.
Кроме того, fclose
очищает буфер пользовательского пространства, который часто используется при записи в файлы для повышения производительности; если процесс завершается без очистки этого буфера (с fflush
/fclose
), данные, все еще находящиеся в буфере, будут потеряны.
Большинство современных операционных систем также восстанавливают память, которую вы malloc()
выделили, но использование free()
, когда это уместно, по-прежнему является хорошей практикой. Дело в том, что, как только вам больше не нужен ресурс, вы должны отказаться от него, чтобы система могла переназначить любые резервные ресурсы, которые были освобождены, для использования другими приложениями (обычно это память). Также существуют ограничения на количество файловых дескрипторов, которые вы можете держать открытыми одновременно.
Кроме того, есть дополнительные соображения в случае open()
и его друзей, в частности, по умолчанию дескрипторы открытых файлов наследуются через поток и fork()
границы процесса. Это означает, что если вы не close()
файловых дескрипторов, вы можете обнаружить, что дочерний процесс может получить доступ к файлам, открытым родительским процессом. Обычно это нежелательно, это тривиальная дыра в безопасности, если вы хотите, чтобы привилегированный родительский процесс порождал подчиненный процесс с меньшими привилегиями.
Кроме того, семантика unlink()
и друзей заключается в том, что содержимое файла «удаляется» только после того, как последний открытый файловый дескриптор файла становится close()
, поэтому еще раз: если вы держите файлы открытыми дольше, чем это строго необходимо, вы вызываете неоптимальное поведение в общая система.
Наконец, в случае сокетов close()
также соответствует отключению от удаленного партнера.
free()
память, но если вы этого не сделаете, в какой-то момент вы израсходуете все ресурсы. - person 5gon12eder   schedule 09.11.2015