• 20145322学号 《信息安全系统设计基础》第9周学习总结(二)


    学号 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
  • 相关阅读:
    AngularJS 简介
    Java基础知识学习(九)
    Java基础知识学习(八)
    算法(二)
    Java基础知识学习(七)
    Java基础知识学习(六)
    Java基础知识学习(五)
    Java基础知识学习(四)
    Java基础知识学习(三)
    Java基础知识学习(二)
  • 原文地址:https://www.cnblogs.com/HZW20145322/p/6060214.html
Copyright © 2020-2023  润新知