После того как работа с дескриптором файла в программе завершена, можно
удалить связь между дескриптором и соответствующим файлом, применив системный
вызов closeO:
finclude
int close (int fd);
Когда closeO срабатывает, проецирование открытого дескриптора файла fd
на сам файл прекращается и процесс отсоединяется от файла. Данный файловый
дескриптор больше не является допустимым, и ядро может повторно использовать
его в качестве возвращаемого значения для последующих вызовов
ореп() и creatO. Вызов closeC) в случае успеха возвращает значение 0. В случае
ошибки он возвращает -1 и соответствующим образом устанавливает переменную
еггпо. Применять его просто:
if (close (fd) == -1)
perror ("close").
Обратите внимание, что закрытие файла не имеет никакого отношения
к тому моменту, когда файл сбрасывается на диск. Если в приложении нужно
удостовериться, что файл будет зафиксирован на диске до того, как он будет закрыт,
то для этого необходимо использовать один из вариантов синхронизации,
которые были рассмотрены в разделе ≪Синхронизированный ввод-вывод≫.
У операции закрытия файла есть тем не менее некоторые побочные эффекты.
Когда закрывается последний открытый дескриптор файла, ссылающийся
на файл, структура данных, представляющая этот файл внутри ядра, освобождается.
Когда структура данных освобождается, она отсоединяет находящуюся
в памяти копию структуры inode, связанной с файлом. Если больше ничего не
удерживает inode в памяти, эта структура также может быть освобождена (она
может и остаться там, так как ядро кэширует структуры inode для улучшения
производительности, но не обязана). Если файл отсоединяется от диска в момент,
когда он еще открыт, то он физически не удаляется до тех пор, пока не будет
закрыт, а его inode не будет удалена из памяти. Следовательно, вызов
closeO может приводить к итоговому физическому удалению отсоединенного
файла с диска.