一切皆文件
1. 文件概念
文件,是 Linux 系统最重要的两个抽象概念之一(另一个是进程)。
在 Linux 中,有一句经典的话叫做一切皆文件。
这句话是站在内核上面的角度说的,因为在内核中的所有设备(网络接口除外)都一律使用 Linux 独有的虚拟文件系统(VFS)来管理。将各种不同的设备用 ”文件“ 这个概念进行封装和屏蔽,简化应用层编程的难度。
2. 文件分类
在 Linux 中,文件总共被分成了 7 类 :
- 普通文件(regular):存放于外部存储器中,用于存储普通数据。
- 目录文件(directory):用于存放目录项,是文件系统管理的重要文件类型。
- 管道文件(pipe):一种用于进程间通信的特殊文件,也称为管道 FIFO。
- 套接字文件(socket):一种用于网络间通信的特殊文件。
- 链接文件(link):用于间接访问另外一个目标文件,相当于一个 Windows 的快捷方式。
- 字符设备文件(character):字符设备在应用层的访问接口。
- 块设备文件(block):块设备在应用层的访问接口。
每个文件信息的最左边一栏,是各种文件的类型的缩写,从上到下依次是:
- b(block)块设备文件
- c(character)字符设备文件
- d(directory)目录文件
- l(link)链接文件
- p(pipe)管道文件
- -(regular)普通文件
- s(socke)套接字文件
块设备文件和字符文件,是 Linux 系统中块设备和字符设备的访问节点,在内核中注册了某一个设备文件之后,还必须在 /dev/ 下为这个设备创建一个对应的节点文件(网络接口设备除外),作为访问这个设备的入口。目录文件用来存放目录项,是实现文件系统管理最重要的手段。链接文件指的是软链接,是一种用来指向别的文件的特殊文件,类似于 Windows 中的快捷方式,也可以拿来做库文件的版本管理。普通文件指的是外部存储器中的文件,比如二进制文件和文本文件。套接字文件指的是本机内进程间通信用的 Unix 域套接字,或称本地域套接字。
3. 文件描述符。
文件描述符是个很小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。
例如:每个进程启动时都打开3个文件:
- 标准输入文件(stdin)
- 标准输出(stdout)
- 标准出错(stderr)
这三个文件分别对应文件描述符0、1、2 。
编程中应该使用 unistd.h 中定义的STDIN_FILENO、 STDOUT_FILENO、 STDERR_FILENO代替数字0、1、2。
4. 文件操作
对一个文件的操作有两种不同的方式:系统IO,标准IO。它们两个的关系如图所示:
4.1 系统IO
- 由操作系统直接提供的函数接口,特点是简洁,功能单一。
- 没有提供缓冲区,对海量数据的操作效率较低。
- 套接字文件、设备文件的访问只能使用系统IO。
4.2 标准IO
- 由标准C库提供的函数接口,特点丰富。
- 提供了缓冲区,对海量数据的操作效率高。
- 编程开发中尽量选择标准IO,但许多场合只能用系统IO。