Scroll to navigation

CLOSE(2) Руководство программиста Linux CLOSE(2)

ИМЯ

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

ОБЗОР

#include <unistd.h>

int close(int fd);

ОПИСАНИЕ

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

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении функции close() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

Значение fd не является допустимым открытым файловым дескриптором.
Вызов close() был прерван по сигналу; см. signal(7).
Произошла ошибка ввода-вывода.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.3BSD, POSIX.1-2001.

ЗАМЕЧАНИЯ

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

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

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

СМОТРИТЕ ТАКЖЕ

fcntl(2), fsync(2), open(2), shutdown(2), unlink(2), fclose(3)

2007-12-28 Linux