Явно закрывать файловые дескрипторы или позволить ОС закрывать их при программировании на Unix C? - PullRequest
3 голосов
/ 19 января 2009

В программировании на Unix C считается ли хорошей практикой явное закрытие дескрипторов файлов перед завершением процесса, или же вместо этого хорошей практикой является позволить ОС закрывать файловые дескрипторы и таким образом избегать ненужного кода?

Какой из этих двух вариантов обычно считается предпочтительной альтернативой?

Пример:

int main (int argc, char* argv[])
{
    int sd;
    sd = socket(...);

    // Snip

   close(sd); // Good or bad practice?
   return 0;
}

Ответы [ 7 ]

10 голосов
/ 19 января 2009

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

Даже если код находится в функции main () верхнего уровня, все равно будет хорошей идеей на случай повторного использования кода.

5 голосов
/ 19 января 2009

Хорошей практикой считается закрывать их самостоятельно.

Вероятно, потому что это хорошая привычка, если ваша программа растет и не завершается в течение некоторого времени после того, как вы закончите использовать определенный "файл".

Исключениями являются stdin, stdout и stderr, которые ваш процесс не открыл.

Кстати, термин UNIX - это "дескриптор файла".

2 голосов
/ 19 января 2009

Я не использовал unix со времен университета, но, полагаясь на закрывающие дескрипторы файлов Unix, вы сокращаете число способов использования вашего кода.

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

Надеюсь, вы найдете это полезным,

2 голосов
/ 19 января 2009

Определенно хорошая практика закрывать их, если можете.

Если ваша программа изменяется так, что файл закрывается раньше, чем позже, вам не нужно добавлять его close() позже, когда ввод / вывод файла будет реорганизован.

1 голос
/ 19 января 2009

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

Опять же, это зависит от типа дескриптора файла. Например, close () сокет очистит его, и если это не удастся, вы можете повторить попытку.

0 голосов
/ 19 января 2009

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

0 голосов
/ 19 января 2009

Я думаю, что это почти «универсально», если у вас есть открытые ресурсы ОС, вы всегда должны закрывать их сразу после того, как закончили их использовать. Таким образом, вы освобождаете эти ресурсы, чтобы они могли использоваться другими приложениями.

Полагаясь на ОС, чтобы закрыть ваши ручки, он просто собирается закрыть их, когда он считает, что они вам больше не нужны (например, выход из приложения). Вы всегда должны освобождать системные ресурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...