|
1.1 文件I/O的简单概念 本章节仅作为初识简单概念,在后续章节会对相关概念进行深入介绍。 在linux系统中有一个概念,一切皆文件,所有的设备都以文件形式存在。 几乎所有的设备、资源都以文件的形式进行访问和操作,简化了操作系统的设计和管理,提供了一种统一的抽象模型,使得应用程序可以使用相同的方法和工具来处理各种文件和资源。 在Linux中,不仅普通文件(如文本文件、图像文件等)被视为文件,还有其他类型的实体也被当作文件对待,例如: 设备文件:Linux将硬件设备抽象为文件,可以通过设备文件进行访问和操作。例如,ELF2开发板的uart9接口可以通过/dev/ttyS9表示,通过读写设备文件,可以进行与硬件设备的交互。 目录:目录也被视为文件,用于组织和存储其他文件和目录。通过目录文件,可以进行文件的查找、创建、删除和移动等操作。 管道(Pipe)和套接字(Socket):Linux提供了管道和套接字机制,用于不同进程之间的通信。管道和套接字也被视为文件,并通过文件描述符进行访问。 虚拟文件系统(Virtual File System):虚拟文件系统是Linux内核提供的一种抽象层,用于统一访问各种文件系统。不同类型的文件系统(如ext4、yaffs等)在虚拟文件系统中被统一处理,使得对文件的操作具有一致的接口和语义。 文件I/O就是对这些文件的输入和输出操作,简单来看就是对文件的读写操作。 对于I/O操作,也分为系统IO和标准IO两种,如下框图: 系统IO操作即在应用程序中直接调用内核的系统函数,而应用程序调用c库函数则是标准IO。 1.1.1 系统IO 系统IO是操作系统提供、不带缓冲机制的输入输出方法,即通过内核提供的系统调用函数来实现I/O操作,可以操作普通文件和驱动文件。 1.1.2 标准IO 标准IO带有缓冲机制,是由标准C库提供的接口函数去实现io操作,即第三方通过封装系统调用函数,得到供用户使用的库,只能操作普通文件。 过于频繁的系统调用会增大系统开销,影响系统的性能,而标准IO中的缓冲机制可以有效的减少系统调用次数。 1.1.3 缓冲 标准IO在操作时会先对内存上的缓冲区进行读写操作,在必要时再去通过系统调用读写实际文件,从而减少系统调用次数,避免系统资源的浪费。 缓冲分有三类: 全缓冲:操作的数据会存储到缓冲区中,在缓冲区填满后再进行对实际文件的IO操作。 行缓冲:操作的数据会存储到缓冲区中,在遇到换行符或者缓冲区满时进行对实际文件的IO操作。 无缓冲:实时对实际文件进行IO操作,不做任何缓冲。 实际上还有内核部分的缓冲,详细内容会在本章节的了解探究(3.2 I/O缓冲)部分进行深入介绍,此处仅需了解缓冲的基本概念。 1.1.4 文件描述符 指进程中被打开的文件的唯一标识,是一个非负整数,目的就是方便系统管理大量被打开的文件。 在调用open函数会有一个返回值,这是一个 int 类型的数据,在open函数执行成功的情况下,会返回一个非负整数,该返回值就是一个文件描述符(file descriptor)。对于 Linux 内核而言,所有打开的文件都会通过文件描述符进行索引。 在Linux系统中,一个进程可以打开的文件数是有限制,并不可以无限制打开很多的文件,因为打开文件会占用系统资源,如果不做限制,可能会导致系统的运行出现问题。而当超过这个限制时,内核将会发送警告信号给对应的进程,然后结束进程。在Linux系统下,可以通过ulimit -n命令来查看进程可打开的最大文件数: $ ulimit -n //执行 1024 //系统返回当前支持最大文件数为1024 文件描述符一般都是从 3 开始,因为0、1、2默认被系统占用: 0:代表标准输入,即程序的标准输入流 (stdin)。 1:代表标准输出,即程序的标准输出流 (stdout)。 2:代表标准错误,即程序的标准错误输出流 (stderr)。
|