| Закрытие файла: close() |
|
Системный вызов close() освобождает файловый дескриптор. Если использовалась буферизация записи данных, то close о посылает в ядро запрос на синхронизацию. Но это вовсе не означает, что данные будут сразу же записаны на носитель. Системный вызов close () объявлен в файле unistd.h следующим образом: int close (int FD); В предыдущих примерах мы умышленно не замечали, что close о может что-то возвращать. Ошибки при закрытии файла — большая редкость, но все-таки они иногда случаются. Поэтому системный вызов closed возвращает 0 при удачном завершении или -1 в случае ошибки. Теперь напишем программу, которая специально "провоцирует" close () на ошибочное завершение. Для этого попытаемся закрыть один и тот же файл дважды. Программа closetwice.c #include <stdio.h> Эта программа аварийная по определению. Обратите внимание, что все блоки обработки ошибок содержат в инструкции return различные числовые значения. Вы наверняка знаете, что функция main () возвращает статус завершения программы, называемый кодом возврата. Исторически сложилась практика, согласно которой нулевой код возврата символизирует об успешном завершении программы, а ненулевой код — об ошибке. Следующая команда позволяет узнать код возврата последней завершившейся программы: $ echo $? Команда echo $? поддерживается даже в оболочках семейства С Shell (csh, tcsh), которые вечно делают все "по-своему". В нашем примере, оба блока проверки close () выводят одно и то же сообщение. Но мы теперь можем узнать, где именно произошла ошибка: $ ./closetwice myfile В программе closetwice есть еще один "подводный камень". Попробуйте запустить эту программу еще раз, указав то же имя файла, что и в предыдущем запуске: $ ./closetwice myfile Cannot create file (myfile) $ echo $? 2 На этот раз до закрытия дело не дошло. Всему виной стал флаг o_excl, который не допускает повторного открытия уже существующего файла.
Related Articles
Set as favorite
Bookmark
Email This
Hits: 243 Комментарии (0)RSS feed CommentsНаписать комментарий |