• 20145324 《信息安全系统设计基础》第九周学习总结


    20145324 《信息安全系统设计基础》第九周学习总结

    教材学习内容总结

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

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

    Unix I/O:

    将设备映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口
    ①打开文件:一个应用程序通过要求内核打开相应的文件,以此宣告要访问一个I/O设备

    描述符:打开文件时,内核返回一个小的非负整数

    Unix外壳创建的每个进程开始时都有三个打开的文件:

    标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)
    ②改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置k,初始为0,seek操作:显式地设置文件的当前位置为k
    ③读写文件:EOF条件
    ④关闭文件:内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中

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

    1.open函数:调用此函数打开一个已存在的文件或者创建一个新文件

    open函数将filename转换为一个文件描述符,并且返回描述符数字。
    返回的描述符总是在进程中当前没有打开的最小描述符。

    flag参数指明进程如何访问文件:
    O_ RDONLY :只读
    O_ WRONLY :只写
    O_ RDWR :可读可写

    flag参数可以是一个或多个更多位掩码的或:
    O_ CREAT:如果文件不存在,就创建它的一个截断的空文件
    O_ TRUNC:如果文件已经存在,就截断它
    O_ APPEND:在每次写操作前,设置文件位置到文件的结尾处

    mode参数指定了新文件的访问权限位

    2.close函数:进程调用该函数关闭一个已经打开的文件

    关闭一个已关闭的描述符会出错

    3.read和write函数:应用程序是通过分别调用read和write函数来执行输入和输出的

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

    返回值:-1:一个错误;0:EOF;否则,返回值:实际传送的字节数量

    write函数:从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置

    一次一个字节地从标准输入拷贝到标准输出

    read和write传送的字节比应用程序要求的少会出现不足值
    产生不足值的原因:
    •读时遇到EOF
    •从终端读文本行
    •读和写网络套接字

    RIO

    健壮的I/O包,自动处理不足值
    提供两种函数:无缓冲的输入输出函数、带缓冲的输入函数
    应用程序通过调用rio_readn和rio_written函数可以在存储器和文件之间直接传送数据
    rio_readn函数在遇到EOF时,只能返回一个不足值
    rio_writen函数后局不会返回不足值

    RIO的带缓冲的输入函数

    一个文本行就是一个由换行符结尾的ASCII码字符序列。 在Unix系统中,换行符(‘ ’)与ASCII码换行符相同,数字值为0x0a

    4.rio_readn函数

    5.rio_writen函数

    应用程序能够通过调用stat和fstat函数检索文件信息(元数据)

    stat函数以一个文件名作为输入
    fstat函数以文件描述符而不是文件名作为输入

    st_ size成员包含了文件的字节数大小
    st_ mode成员则编码了文件访问许可位和文件类型
    文件类型包括:
    普通文件:某种类型的二进制或文本数据
    目录文件:关于其他文件的信息
    套接字:一种用来通过网络与其他进程通信的文件

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

    S_ ISREG():这是一个普通文件吗?
    S_ ISDIR():这是一个目录文件吗?
    S_ ISSOCK():这是一个网络套接字吗?

    共享文件

    内核使用三个相关的数据结构来表示打开的文件:
    ①描述符表:每个进程都有它独立的描述符表,每个打开的描述符表项指向文件表中的一个表项
    ②文件表:所有进程共享这张表,每个文件表的表项组成包括有当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针,直到引用计数为0,内核才会删除该文件表表项。
    ③v-node表:所有进程共享这张v-node表,多个描述符可以通过不同的文件表表项来引用同一个文件

    关键思想是每个描述符都有它自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据

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

    标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构的指针
    每个ANSIC程序开始都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出、标准错误

    类型为FILE的流是对文件描述符和流缓冲区的抽象
    流缓冲区的目的和RIO读缓冲区的一样,就是开销较高的Unix I/O系统调用的数量尽量能的小

    代码调试中的问题和解决过程

    找不到地方下载csapp.h csapp.c文件,教材上的代码无法编译

    关于grep -nr xxx /usr/include 命令的使用

    grep -nr 这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容

    使用man -k sort | grep 3,可以更好的找到qsort

    本周代码托管截图

    学习进度条

    博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 30篇 400小时
    第零周 1/1 20/20
    第一周 1/2 20/40
    第二周 1/3 20/60
    第三周 1/4 20/80
    第四周 1/5 20/100
    第五周 1/6 20/120
    第六周 1/7 20/140
    第七周 1/8 20/160
    第八周 5/13 20/180
    第九周 1/14 20/200

    参考资料

  • 相关阅读:
    Java中try-catch-finally的一点理解
    子类继承父类的私有属性
    Java中的String[] args
    Java类和类成员的访问权限修饰符
    JAVA中抽象类与接口的区别
    Java C# .net 和 C C++ 跨平台的区别
    Java中的instanceof关键字
    深入理解JAVA的多态性[转]
    Linux文件系统的目录结构
    硬盘分区
  • 原文地址:https://www.cnblogs.com/SJZGM10/p/6048245.html
Copyright © 2020-2023  润新知