天天看点

##CSAPP读书日记-第十章-系统级I/O

什么是系统级I/O?

输入/输出(I/O)是在主存和外部设备之间复制数据的过程。

Unix I/O中的关键抽象

所有的I/O设备都被模型化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行.

这种将设备优雅地映射为文件的方式,允许Linux内核引出一个简单、低级的应用接口,成为Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:

  1. 打开文件。

    内核记录有关这个打开文件的所有信息。应用程序只需要记住这个描述符。

  2. Linux shell创建的每个进程开始时都有三个打开的文件:

    标准输入(0)

    标准输出(1)

    标准错误(2)

  3. 改变当前的文件位置。

    这个文件位置是从文件开头起始的字节偏移量。

  4. 读写文件。

    当文件位置 >= 文件大小的时候,会触发EOF(=End Of File)的条件,应用程序能检测这个条件。

    在文件结尾处并没有明确的EOF符号。

  5. 关闭文件。

    无论一个进程因为何种原因终止时,内核都会关闭所有这个进程打开的文件并释放它们的内存资源。

##CSAPP读书日记-第十章-系统级I/O

stat以文件名作为输入,fstat以文件描述符作为输入。

以下说明了有哪些元数据:

##CSAPP读书日记-第十章-系统级I/O

补充:

什么是文件描述符?

每当你打开一个文件就会获得该文件的文件描述符fd(file discriptor),这个文件描述符就是一个整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 如下图所示:

##CSAPP读书日记-第十章-系统级I/O

图中,文件描述符即为文件描述符数组的下标。

文件描述符的分配规律:从当前未使用的最小的整数处开始分配 。比如说如果你打开一个文件系统会自动为它打开三个文件,分别是stdin,stdout,stderr,就是标准输入,标准输出,标准输出。他们的文件描述符分别是 0,1,2,也就是说当你的文件打开时它的文件描述符就从3开始分配了,如果你把那三个文件关闭一个,例如,关掉标准输入,则打开的文件的文件描述符将会填上0,让后再往后分配。

标准 I/O:

C语言定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。

标准I/O库将一个打开的文件模型化为一个流。

类型是FILE的流是对文件描述符和流缓冲区的抽象。

各种I/O包的总结:

##CSAPP读书日记-第十章-系统级I/O

使用指导:

##CSAPP读书日记-第十章-系统级I/O
##CSAPP读书日记-第十章-系统级I/O
##CSAPP读书日记-第十章-系统级I/O