Skip to content

Home Программирование Закрытие файла: close()
Закрытие файла: close()

Системный вызов close() освобождает файловый дескриптор. Если использовалась буферизация записи данных, то close о посылает в ядро запрос на синхронизацию. Но это вовсе не означает, что данные будут сразу же записаны на носитель.

Системный вызов close () объявлен в файле unistd.h следующим образом:

int close   (int FD);

В предыдущих примерах мы умышленно не замечали, что close о может что-то возвращать. Ошибки при закрытии файла — большая редкость, но все-таки они иногда случаются. Поэтому системный вызов closed возвращает 0 при удачном завершении или -1 в случае ошибки.

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

Программа closetwice.c

#include <stdio.h> 
#include <fcntl.h>
#include <unistd.h>
int main (int argc, char ** argv)
{
int fd;
if (argc < 2)
{
fprintf (stderr, "Too few arguments\n");
return 1;
}
fd = open (argvfl], QJWRONLY j 0_CREAT j 0_EXCL, 0644);
if (fd == -1)
{
fprintf (stderr, "Cannot create file (%s)\n", argv[1]);
return 2;
}
if (close (fd) == -1)
{
fprintf (stderr, "Cannot close file " "with descriptor=%d\n", fd);
return 3;
}
if (close (fd) == -1)
{
fprintf (stderr, "Cannot close file " "with descriptor=%d\n", fd);
return 4;
}
return 0;
}

Эта программа аварийная по определению. Обратите внимание, что все блоки обработки ошибок содержат в инструкции return различные числовые значения. Вы наверняка знаете, что функция main () возвращает статус завершения программы, называемый кодом возврата. Исторически сложилась практика, согласно которой нулевой код возврата символизирует об успешном завершении программы, а ненулевой код — об ошибке. Следующая команда позволяет узнать код возврата последней завершившейся программы:

$ echo $?

Команда echo $? поддерживается даже в оболочках семейства С Shell (csh, tcsh), которые вечно делают все "по-своему".

В нашем примере, оба блока проверки close () выводят одно и то же сообщение. Но мы теперь можем узнать, где именно произошла ошибка:

$ ./closetwice myfile
Cannot close file with descriptor=3
$ echo $?
4

В программе closetwice есть еще один "подводный камень". Попробуйте запустить эту программу еще раз, указав то же имя файла, что и в предыдущем запуске:

$ ./closetwice myfile Cannot create file (myfile) $ echo $? 2

На этот раз до закрытия дело не дошло. Всему виной стал флаг o_excl, который не допускает повторного открытия уже существующего файла.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top