linux file description

Linux系统编程

文件IO

在对文件进行读写操作前,需要先打开该文件,内核为每个进程维护一个打开文件的列表,该表被称为文件表(file table)。该表由一些叫做文件描述符fdfile description)的非负整数进行索引。

clip_image001

每个进程按照惯例都会至少有三个打开的文件描述符:012,除非进程显式地关闭它们。文件描述符0是标准输入stdin,文件描述符1是标准输出stdout,文件描述符2是标准错误stderrC标准库提了预处理器宏:STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO宏,以取代对以上整数的直接引用。

clip_image002

      需要注意的是,文件描述符不仅仅用于普通文件的访问,也用于访问设备文件、管道、目录以及快速用户空间锁、FIFOs和套接字。遵循一切皆文件的理念,任何你能读写的东西都可以用文件描述符来访问。

关闭文件的副作用

clip_image003

关闭文件有一些副作用,当最后一个引用某文件的文件描述符关闭后,在内核中表示该文件的数据结构就被释放了,当它释放时,与文件关联的inode的内存拷贝被清除,如果没有什么连接到该inode,它可能会从内存中清除(也有可能保留在内存中,因为内核为了效率缓存一些inode,但也可能不需要)。如果文件已经从磁盘解除链接,但在解除前仍保持打开,它在被关闭且inode从内存中移除前就不会真的被删除。因而,对close的调用可能会使某个已经解除链接的文件最终从磁盘上被删除。