close(2) - Linux 手册页

名称

close - 关闭一个文件描述符

概要

#include <unistd.h>
int close(int fd);

描述

close() 关闭一个文件描述符,使其不再指向任何文件,并且可以被重用。任何与该文件描述符关联的记录锁(参见 fcntl(2)),以及由该进程拥有的锁,都会被移除(无论使用哪个文件描述符获得锁)。

如果 fd 是引用底层打开文件描述符的最后一个文件描述符(参见 open(2)),则与打开文件描述符关联的资源将被释放;如果该描述符是使用 unlink(2) 删除的文件最后一个引用,则该文件将被删除。

返回值

close() 成功时返回零。 发生错误时,返回 -1,并且 errno 会被设置为适当的值。

错误

EBADF
fd 不是一个有效的打开文件描述符。
EINTR
close() 调用被信号中断;参见 signal(7)
EIO
发生了 I/O 错误。

符合

SVr4, 4.3BSD, POSIX.1-2001。

说明

不检查 close() 的返回值是一个常见的但仍然是严重的编程错误。 之前 write(2) 操作中的错误很有可能在最终的 close() 时才被报告。 在关闭文件时未检查返回值可能会导致数据静默丢失。 这在 NFS 和磁盘配额中尤其明显。

成功的 close 并不能保证数据已成功保存到磁盘,因为内核会延迟写入。 文件系统在关闭流时通常不会刷新缓冲区。 如果您需要确保数据物理存储,请使用 fsync(2)。(这将取决于磁盘硬件。)

在同一进程的其他线程中可能正在使用的文件描述符上关闭它们可能不明智。 由于文件描述符可以被重用,因此存在一些晦涩的竞争条件,可能导致意想不到的副作用。

参见

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

引用自

__pmconnectlogger(3), archive_read(3), archive_write(3), closedir(3), cpuset(7), dbopen(3), dup2(2), epoll(7), epoll_create(2), eventfd(2), explain(1), explain(3), explain_close(3), explain_close_or_die(3), explain_lca2010(1), fcloseall(3), filter_create_fd(3), flock(2), fts(3), getdtablesize(2), getdtablesize(3), inotify(7), lam_rfposix(2), lamf_rfclose(2), mkfifo(3), ncl_cgm(3), netclose(3), nfs(5), perfmonctl(2), pidfile(3), pipe(7), pipethrough(3), read(2), shm_open(3), shm_overview(7), signalfd(2), socket(2), socket(7), spu_create(2), spu_run(2), spufs(2), spufs(7), star(1), stdio(3), tar_open(3), timerfd_create(2)