close(2) закрывает файловый дескриптор

ОБЗОР

#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) (в этом случае всё будет зависеть от оборудования).

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