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


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

    教材学习内容总结

    第十章 系统级I/O

    10.1 Unix I/O

    • I/O设备:网络、磁盘和终端

    • Unix I/O :将设备映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口。

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

    • Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。

    • 改变当前的文件位置:文件位置为k,初始为0。

    • seek操作:显式地设置文件的当前位置为k。

    • EOF:是一个条件,而不是一个符号。

    10.2 打开和关闭文件

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

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int open(char *filename,int flags,mode_t mode);
    
    • open函数将filename转换为一个文件描述符,并且返回描述符数字。

    • 返回的描述符总是在进程中当前没有打开的最小描述符。

        O_ RDONLY :只读 
        O_ WRONLY :只写 
        O_ RDWR :可读可写
      

    2、flag参数可以是一个或多个更多位掩码的或。

    O_ CREAT:如果文件不存在,就创建它的一个截断的空文件
    O_ TRUNC:如果文件已经存在,就截断它 
    O_ APPEND:在每次写操作前,设置文件位置到文件的结尾处。
    

    3、mode参数指定了新文件的访问权限位。文件的访问权限位被设置为mode & ~umask
    10.3 读和写文件
    1、应用程序是通过分别调用read和write函数来执行输入和输出的。

    #include <unistd.h>
    ssize_t read(int fd,void *buf,size_t n);
    ssize_t write(int fd,const void *buf,size_t n);
    

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

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

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

    4、lseek函数:应用程序能够显式地修改当前文件的位置。

    5、不足值:read和write传送的字节比应用程序要求的少。

    10.4 用RIO包健壮地读写

    1、RIO包的实质:I/O包

    2、RIO包提供的两种函数:

    • 无缓冲的输入输出函数、带缓冲的输入函数(线程安全)

    3、应用程序通过调用rioreadn和riowritten函数可以在存储器和文件之间直接传送数据。

    #include "csapp.h"
    ssize_t rio_readn(int fd,void *usrbuf,size_t n);
    ssize_t rio_writen(int fd,void *usrbuf,size_t n);
    
    • rio_ readn函数在遇到EOF时,只能返回一个不足值;

    • rio_ writen函数后局不会返回不足值。

    5、RIO的带缓冲的输入函数

    • 一个文本行就是一个有换行符结尾的ASCII码字符序列。

    • 在Unix系统中,换行符(‘ ’)与ASCII码换行符(LF)相同,数字值为0x0a。

    10.5 读取文件元数据

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

    #include <unistd.h>
    #include <sys/stat.h>
    int stat(const char *filename,struct stat *buf);
    int fstat(int fd,struct stat *buf);
    
    • stat函数以一个文件名作为输入,填写一个stat数据结构中的各个成员。

    • fstat函数以文件描述符而不是文件名作为输入。

    • st_ size成员包含了文件的字节数大小。

    • st_ mode成员则编码了文件访问许可位和文件类型。

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

    10.6 共享文件

    1、内核使用三个相关的数据结构来表示打开的文件:

    • 描述符表:每个进程都有它独立的描述符表。 每个打开的描述符表项指向文件表中的一个表项。

    • 文件表:所有进程共享这张表。每个文件表的表项组成包括有当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针。

    • 直到引用计数为0,内核才会删除该文件表表项。

    • v-node表:所有进程共享这张v-node表。

    2、多个描述符可以通过不同的文件表表项来引用同一个文件。

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

    3、在内核删除相应文件表项之前,父子进程必须都关闭了它们的描述符。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 16篇 400小时
    第一周 80/80 1/1 20/20
    第二周 130/210 1/2 18/38
    第三周 300/510 1/3 22/60
    第五周 300/810 1/4 20/80
    第六周 150/960 1/5 20/100
    第七周 120/1080 1/6 20/120
    第八周 0/1080 1/7 20/140
    第九周 300/1380 1/8 20/160
  • 相关阅读:
    关于模式窗体的缓存问题的解决方案
    C# 读取网页
    C# 压缩文件
    C#实现反射调用动态加载的DLL文件中的方法
    在线程中修改窗体控件内容
    C# 启用双缓存,避免ListView控件加载数据时闪烁
    JBuilder2005破解方法
    C# combbox datatable 赋值
    今天感觉到秋凉了~
    烦人的流程图~~~
  • 原文地址:https://www.cnblogs.com/rx719523850/p/6060390.html
Copyright © 2020-2023  润新知