close 子例程

用途

关闭文件描述符。

语法

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

描述

close 子例程关闭与 FileDescriptor 参数相关联的文件或共享内存对象。 如果系统上安装了网络文件系统 (NFS) ,那么此文件可以驻留在另一个节点上。

与此进程先前使用 lockffcntl 子例程锁定的 FileDescriptor 参数指定的文件关联的所有文件区域都将解锁。 即使进程仍将文件由另一个文件描述符打开,也会发生此情况。

如果 FileDescriptor 参数是由指定了 O_延迟open 子例程产生的,并且这是最后一个文件描述符,那么将废弃自最后一个 fsync 子例程以来对该文件所作的所有更改。

如果 FileDescriptor 参数与映射文件相关联,那么将取消映射该文件。 shmat 子例程提供有关映射文件的更多信息。

close 子例程尝试在此文件描述符上取消未完成的 异步 I/O 请求 。 如果无法取消异步 I/O 请求,那么将阻塞应用程序,直到这些请求完成为止。

如果 FileDescriptor 参数与共享内存对象相关联,并且共享内存对象在最后一个关闭时仍被引用 (即,进程已映射) ,那么该内存对象的整个内容将持续存在,直到该内存对象变为未被引用为止。 如果这是共享内存对象的最后一个关闭,并且关闭导致内存对象变为未引用,并且内存对象已取消链接,那么将除去内存对象。 shm_open 子例程提供有关共享内存对象的更多信息。

close 子例程被阻塞,直到使用文件描述符的所有子例程返回到 usr 空间。 例如,当一个线程正在调用 close ,而另一个线程正在调用具有相同文件描述符的 select 时, close 子例程直到 select 调用返回才会返回。

当与管道或 FIFO 特殊文件关联的所有文件描述符都已关闭时,将废弃管道或 FIFO 中剩余的任何数据。 如果当与文件关联的所有文件描述符都已关闭时,该文件的链接计数为 0 ,那么将释放该文件所占用的空间,并且该文件不再可访问。

注: 如果 FileDescriptor 参数引用设备,并且 close 子例程实际导致设备 close,并且设备 close 例程返回错误,那么该错误将返回到应用程序。 但是, FileDescriptor 参数被视为已关闭,不能在任何后续调用中使用。

当进程退出时,将关闭所有打开的文件描述符。 此外,如果为文件描述符设置了 close-on-exec 标志,那么可以在 exec 子例程期间关闭文件描述符。

参数

描述
FileDescriptor 指定有效的打开文件描述符。

返回值

成功完成后,将返回值 0。 否则,返回值为-1,并设置errno全局变量来标识错误。

底层文件系统实现可能会将 /usr/include/errno.h 文件中的任何一个值报告给 close 子例程。 关闭子程序的返回值为-1,errno全局变量被设置为文件系统的返回值,但文件仍被关闭。 FileDescriptor参数的状态为关闭,错误代码部分指定的情况除外。

错误代码

如果以下情况成立,那么 close 子例程不成功:

描述
EBADF FileDescriptor 参数未指定有效的打开文件描述符。

如果要关闭的文件是 NFS安装的,并且服务器在以下情况下关闭,那么 close 子例程也可能不成功:

  • 该文件位于硬安装上。
  • 将以任何方式锁定该文件。

如果安装了 NFS 并且以下情况成立,那么 close 子例程也可能不成功:

描述
ETIMEDOUT 连接超时。
如果满足以下条件,那么将无法确定 close 子例程的成功:
描述
EINTR FileDescriptor 的状态未确定。 重试 close 例程以确保 FileDescriptor 已关闭。