本章介绍Unix I/O 和标准I/O的一般概念,具体的细节什么的还是看书比较好。
- 一个Linux 文件就是一个 m 个字节的序列,所有的I/O设备都被模型化为文件,而所有的输入和输出都被当作对响应文件的读和写来执行。这种将设备优雅地映射为文件地方式,允许Linux内核引出一个简单、低级地应用接口,称为Unix I/O,这使得所有地输入和输出都能以一种统一且一致地方式来执行:
- 打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O 设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。
- Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2).
- 改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置就是从文件开头起始的字节偏移量。应用程序能够通过执行seek 操作,显示地设置文件地当前位置为k。
- 读写文件。一个读操作就是从文件复制 n>0 个字节到内存,从当前文件位置 k 开始,然后将k 增加到 k+n。给定一个大小为m 字节的文件,当 k ≥ m 时执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测这个条件。在文件结尾处并没有明确的“EOF符号”。
类似的,写操作就是从内存复制 n>0 个字节到一个文件,从当前文件位置 k 开始,然后更新k 。 - 关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的内存资源。
- 每个Linux文件都有一个类型来表明它在系统中的角色:
- 普通文件包含任意数据。应用程序常常需要区分文本文件和二进制文件。
- 目录是包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。每个目录至少含有两个条目:“.” 是到该目自身的链接,以及“…” 是到目录层次结构中父目录的链接。
- 套接字(socket)是用来与另一个进程进行跨网络通信的文件。
其他文件类型包含命名通道、符号链接,以及字符和块设备。
-
关于打开关闭文件,读写文件等都是代码了,建议直接看书。
-
共享文件
内核用三个相关的数据结构来标识打开的文件:
- 描述符表。
- 文件表。每个文件表的表项组成包括当前的文件位置、引用计数(即当前指向该表项的描述符表项数),以及一个指向v-node表中对应表项的指针。
- v-node表。
- 标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。类型为FILE的流是对文件描述符和流缓冲区的抽象。