什么是 I/O?
在计算机科学中,输入/输出(I/O,Input/Output)是指计算机接收和发送数据的过程,也可以表达为计算机输入和输出的过程。
它是计算机与外部(键盘、鼠标、传感器、显示器、打印机、扬声器等)交流的基础。
输入 (Input) - 指的是数据从外部源(例如键盘、鼠标、传感器、其他设备)传入计算机系统的过程。
输出 (Output) - 指的是数据从计算机传递到外部设备(例如显示器、打印机、扬声器、网络或存储设备)的过程。
「一切皆文件」理念
Linux的设计哲学是「一切皆文件」。这意味着所有的I/O设备,都被视为「文件」。因此,所有的输入和输出操作都可以看作是对文件的读和写。
一切皆文件的设计思想让 Linux 内核为应用程序提供了一个简化、统一的接口,称为 Unix I/O。这使得所有的 I/O 操作都可以通过统一的方式进行。
文件的多种形态
每个文件都有一个类型来表明它在系统中的角色:
- 普通文件:包含任意数据。虽然应用程序可能区分文本文件和二进制文件,但对内核而言,它们是相同的。
- 目录:它是一系列文件链接的集合,每个链接都将一个文件名与一个文件关联起来,一个文件可能是另一个目录。
- 套接字:它是用于在进程之间进行跨网络通信的文件。
所有文件都被组织在一个目录结构中,由一个名为“/”的根目录确定。实际上,系统中的每个文件都是根目录的直接或间接后代。
文件操作
- 打开与关闭:进程使用**
open函数打开或创建文件,而close**函数则用于关闭文件。 - 读写操作:应用程序调用**
read和write**函数来执行I/O操作。 - 读取目录:应用程序可以使用**
readdir系列函数来读取目录内容,例如opendir**函数。
标准I/O库
C 语言提供了一个高级 I/O 函数集合,称为「标准I/O库」。此库提供了一系列功能,如文件的打开与关闭、字节的读写,以及复杂的格式化功能。
这些高级 I/O 操作将文件视为一个「流」,从程序员的角度看,一个流就是一个指向**FILE**类型的结构的指针。
需要注意的是,标准 I/O 库是基于 Unix I/O 函数构建的。Unix I/O 模型在操作系统内核中实现,而标准 I/O 库提供了一个更高级的接口来访问这些底层功能。
输入/输出(I/O)是计算机与外部设备交互的核心过程,允许数据的接收和发送。在Linux系统中,这种交互遵循“一切皆文件”的哲学,将所有设备和接口都视为文件。
这不仅简化了系统与设备的交互,而且为文件的操作(如打开、关闭、读和写)提供了统一的接口。
而C语言的标准I/O库进一步对这些底层操作进行了封装,为程序员提供了一个更加简洁和高效的方式来处理文件和数据流,实际上它是建立在Unix I/O基础之上,为开发者提供了与文件交互的高级工具。
内容来源:《深入理解计算机系统》
如果您对本篇文章中提到的问题有任何疑问或想法,请在评论区留言,我将尽力回复。
微信公众号「小道研究」,获取更多关于前端技术的深入分析和实践经验。