CLOSE(2)

ИМЯ
close - закрывает файловый дескриптор

ОБЗОР
#include <unistd.h>

int close(int fd);

ОПИСАНИЕ
Функция close() закрывает файловый дескриптор, который после этого не ссылается ни на один и файл и может быть использован повторно. Все блокировки (см. fcntl(2)), связанные с соответствующим файлом и принадлежащие процессу, снимаются (независимо от того, какой файловый дескриптор был ли использован для установки блокировки).

Если fd является последней копией какого-либо файлового дескриптора, ссылающегося на используемое описание открытого файла, (см. open(2)), то ресурсы, связанные с описанием открытого файла, освобождаются; если файловый дескриптор был последней ссылкой на файл, удалённый с помощью unlink(2), то файл окончательно удаляется.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функции close() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EBADF
    Значение fd не является допустимым открытым файловым дескриптором.

EINTR
    Вызов close() был прерван по сигналу; см. signal(7).

EIO Произошла ошибка ввода-вывода.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

ЗАМЕЧАНИЯ
Не проверять значение, возвращаемое функцией close() — обычная, но от этого не менее серьезная ошибка программирования. Вполне возможно, что ошибка в предыдущей операции write(2) впервые даст о себе знать при выполнении завершающего close(). Отсутствие проверки возвращаемого значения при закрытии файла может привести к незамеченной потере данных. Особенно часто это может происходить при использовании NFS и дисковых квот. Заметим, что возвращаемое значение должно использоваться только для диагностики. В частности, close() никогда не нужно повторять после EINTR, так как это может привести к закрытию повторно используемого файлового дескриптора другой нити.

Выполнение закрытия без ошибок не гарантирует, что данные были успешно записаны на диск, так как в ядре используется буферный кэш для отложенных записей. Как правило, файловые системы не записывают буферы при закрытии файла. Если требуется гарантировать физическую запись на используемый диск, то можно использовать fsync(2) (дальше всё будет зависеть от аппаратной составляющей диска).

Флаг файлового дескриптора закрытие-при-exec можно использовать для гарантии того, что файловый дескриптор автоматически закроется при успешном выполнении execve(2); подробности смотрите в fcntl(2).

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

СМОТРИТЕ ТАКЖЕ
fcntl(2), fsync(2), open(2), shutdown(2), unlink(2), fclose(3)