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)。
349