学号 20145322《信息安全系统设计基础》第X周学习总结(二)
教材学习内容总结
RIO包会自动处理不足值。RIO提供了两类不同的函数:
无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲,他们对将二进制数据读写到网络和从网络读写二进制数据尤其有用。
带缓冲的输入函数。这些函数允许你高效地从文件中读取文本行和二进制数据,这些文件的内容缓存在应用级缓冲区内,类似于像printf这样的标准I/O函数提供的缓冲区。是线程安全的,它在同一个描述符上可以被交错地调用。例如,可以从一个描述符中读一些文本行,然后读取一些二进制数据,接着再多读取一些文本行。
RIO的无缓冲的输入输出函数
通过调用rio_readn和rio_writen函数,应用程序可以在存储器和文件之间直接传送数据。
如果rio_readn和rio_writen函数被一个从应用信号处理程序的发放你会中断,那么每个函数都会手动地重启read或write。为了尽可能有较好地可移植性,允许被中断的系统调用,并在必要时重启他们。
RIO的带缓冲的输入函数
一个文本行就是一个由换行符结尾的ASCII码字符序列。在Unix系统中,换行符(‘ ')与ASCII码换行符(LF)相同,数字值为0x0a。
用一个程序来计算文本文件中文本行的数量:用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。这个方法的缺点是效率低,每读取文件中的一个字节都要求陷入内核。
另一种方法是调用一个包装函数(rio_readlineb),它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区。对于既包含文本行也包含二进制数据的文件,我们也提供了一个rio_readn带缓冲区的版本,叫做rio_readnb,它从和rio_readlineb一样的读缓冲区中传送原始字节。
应用程序能够通过调用stat和fstat函数,检索到关于文件的信息(元数据)。
文件类型:
普通文件:二进制或文本数据,宏指令:S_ISREG()
目录文件:包含其他文件的信息,宏指令:S_ISDIR()
套接字:通过网络和其他进程通信的文件,宏指令:S_ISSOCK()
3、Unix提供的宏指令根据st_mode成员来确定文件的类型
内核用三个相关的数据结构来表示打开的文件:
描述符表:每个打开的描述符表项指向文件表中的一个表项
文件表:所有进程共享这张表,每个表项包括文件位置,引用计数,以及一个指向v-node表对应表项的指针
v-node表:所有进程共享这张表,包含stat结构中的大多数信息
三种打开文件的类型:
典型:描述符各自引用不同的文件,没有共享
共享:多个描述符通过不同的文件表表项引用同一个文件。(关键思想:每个描述符都有自己的文件位置,对不同描述符的读操作可以从文件的不同位置获取数据)
继承:子进程继承父进程打开文件。调用fork后,子进程有一个父进程描述符表的副本,父子进程共享相同的打开文件表集合,因此共享相同的文件位置
遇到的问题和解决方法
在看教材内容时,很不明白EOF是什么意思?
解决过程:结合前后教材内容以及询问同学后明白,EOF大概意思是一个信号,表示一个文件的结尾。
具体怎样来处理不足值?
解决:通过反复调用read和write。
内核使用三个相关的数据结构来表示打开的文件:
描述符表:每个进程都有它独立的描述符表。 每个打开的描述符表项指向文件表中的一个表项。
文件表:所有进程共享这张表。每个文件表的表项组成包括有当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针。
直到引用计数为0,内核才会删除该文件表表项。
v-node表:所有进程共享这张v-node表。
2、多个描述符可以通过不同的文件表表项来引用同一个文件。
关键思想是每个描述符都有它自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据。
3在内核删除相应文件表项之前,父子进程必须都关闭了它们的描述符。
代码托管截图
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 100/100 | 1/1 | 13/20 | |
第二周 | 100/200 | 1/2 | 15/38 | |
第三周 | 100/300 | 1/3 | 20/60 | |
第五周 | 70/370 | 2/5 | 30/90 | |
第六周 | 200/570 | 2/7 | 40/90 | |
第七周 | 0/570 | 2/9 | 30/120 | |
第八周 | 0/570 | 2/9 | 50/170 | |
第九周 | 78/570 | 2/11 | 40/170 |