跳到主要内容

一切皆文件

1. 文件概念

文件,是 Linux 系统最重要的两个抽象概念之一(另一个是进程)。

在 Linux 中,有一句经典的话叫做一切皆文件

这句话是站在内核上面的角度说的,因为在内核中的所有设备(网络接口除外)都一律使用 Linux 独有的虚拟文件系统(VFS)来管理。将各种不同的设备用 ”文件“ 这个概念进行封装和屏蔽,简化应用层编程的难度。

2. 文件分类

在 Linux 中,文件总共被分成了 7 类:

  1. 普通文件(regular):存放于外部存储器中,用于存储普通数据。
  2. 目录文件(directory):用于存放目录项,是文件系统管理的重要文件类型。
  3. 管道文件(pipe):一种用于进程间通信的特殊文件,也称为管道 FIFO。
  4. 套接字文件(socket):一种用于网络间通信的特殊文件。
  5. 链接文件(link):用于间接访问另外一个目标文件,相当于一个 Windows 的快捷方式。
  6. 字符设备文件(character):字符设备在应用层的访问接口。
  7. 块设备文件(block):块设备在应用层的访问接口。

ZuLHZv.png

每个文件信息的最左边一栏,是各种文件的类型的缩写,从上到下依次是:

  • 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。它们两个的关系如图所示:

ZuLTmX.png

4.1 系统IO

  • 由操作系统直接提供的函数接口,特点是简洁,功能单一。
  • 没有提供缓冲区,对海量数据的操作效率较低。
  • 套接字文件、设备文件的访问只能使用系统IO。

4.2 标准IO

  • 由标准C库提供的函数接口,特点丰富。
  • 提供了缓冲区,对海量数据的操作效率高。
  • 编程开发中尽量选择标准IO,但许多场合只能用系统IO。