• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-系统应用编程之文件I/O

10/24 16:44
349
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

相关推荐