第九周学习总结

时间:2022-11-01 08:07:49

系统级I/O

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

输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备、。

所有的输入输出都被当做对相应的文件的读和写来执行。

一、Unix I/O

1.打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问的一个I/O设备。

内核返回的小的非负整数叫做描述符。

2.改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置K,初始为0,。这个文件位置是从文件开头起始的字节偏移量

3.读写文件:读操作就是从文件中拷贝n>0个字节到存储器,从当前文件位置开始K开始,然后将K增加到K+N。

4.关闭文件:当应用完成了对文件的访问之后,就通知内核关闭这个文件,作为响应,内核释放文件打开时创建的数据结构,并将描述符恢复到可用描述符池中。

 

二、打开和关闭文件

1.open函数将filename转化为文件描述符,并且返回描述符数字(为当前没有打开的最小描述符)

2.flag参数表示进程打算如何访问文件:

只读O_RDONLY

只写O_WRONLY

可读可写O_RDWR

3.mode参数表示指定了新文件的访问权限位

作为上下文的一部分,每个进程都有一个umask,通过调用来实现的

 

三、读和写文件

1.read函数从描述符为fd的当前文件位置拷贝最多N个字节到存储器位置buf

返回值为-1表示一个错误

返回值为0表示EOF

否则返回值表示实际传送的字节数量

2.write函数从存储器位置buf拷贝至多N个字节到fd的当前文件位置

 

四、用RIO包健壮的读写

RIO:自动处理不足值,提供两类函数

        无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲。

        带缓冲的输入函数。这些函数允许高效的从文件中读取文本行和二进制数据,文件内容缓存在应用级缓冲区中。

1.无缓冲的输入输出函数:rio_readen,rio_writen函数

2.带缓冲的输入函数:一种方法是用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。缺点是效率不是很高,读取一个字节都要求陷入内核;一种方法是调用一个包装函数rio_readlineb,它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空,会自动调用read重新填满缓冲区。

3.RIO读程序的核心是:rio_read函数

调用该函数时,要求读N个字节。如果缓冲区为空,那么会调用read填满。如果缓冲区非空,函数就得从读缓冲区拷贝N和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝的字节数。

 

 

五、读取文件元数据

1.stat函数:以一个文件名作为输入,填写成员,主要讨论st_mode,st_size

st_size:包含了文件的字节数大小

st_mode:编码了文件访问的许可位

 

Unix提供的宏指令根据st_mode成员来确定文件的类型

六、共享文件

描述符表

文件表

v-node表

七、I/O重定向

UNIX外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来

(图10-14)

 

 

 

问题:共享文件一节里10-13图的理解不懂,第一节,第二节的示例代码中一些语句不懂。

感想:本章的内容大多限定在定义概念,看懂代码还需要多下功夫