什么是系统级I/O?
输入/输出(I/O)是在主存和外部设备之间复制数据的过程。
Unix I/O中的关键抽象
所有的I/O设备都被模型化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行.
这种将设备优雅地映射为文件的方式,允许Linux内核引出一个简单、低级的应用接口,成为Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:
-
打开文件。
内核记录有关这个打开文件的所有信息。应用程序只需要记住这个描述符。
-
Linux shell创建的每个进程开始时都有三个打开的文件:
标准输入(0)
标准输出(1)
标准错误(2)
-
改变当前的文件位置。
这个文件位置是从文件开头起始的字节偏移量。
-
读写文件。
当文件位置 >= 文件大小的时候,会触发EOF(=End Of File)的条件,应用程序能检测这个条件。
在文件结尾处并没有明确的EOF符号。
-
关闭文件。
无论一个进程因为何种原因终止时,内核都会关闭所有这个进程打开的文件并释放它们的内存资源。
stat以文件名作为输入,fstat以文件描述符作为输入。
以下说明了有哪些元数据:
补充:
什么是文件描述符?
每当你打开一个文件就会获得该文件的文件描述符fd(file discriptor),这个文件描述符就是一个整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 如下图所示:
图中,文件描述符即为文件描述符数组的下标。
文件描述符的分配规律:从当前未使用的最小的整数处开始分配 。比如说如果你打开一个文件系统会自动为它打开三个文件,分别是stdin,stdout,stderr,就是标准输入,标准输出,标准输出。他们的文件描述符分别是 0,1,2,也就是说当你的文件打开时它的文件描述符就从3开始分配了,如果你把那三个文件关闭一个,例如,关掉标准输入,则打开的文件的文件描述符将会填上0,让后再往后分配。
标准 I/O:
C语言定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。
标准I/O库将一个打开的文件模型化为一个流。
类型是FILE的流是对文件描述符和流缓冲区的抽象。
各种I/O包的总结:
使用指导: