zoukankan      html  css  js  c++  java
  • 20145321 《信息安全系统设计基础》第九周学习总结

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

    教材内容总结

    Unix I/O

    • 一个Unix文件就是一个m个字节的序列:B0,B1,...,Bk,...,B(m-1)
    • 所有的I/O设备,如网络、磁盘、和终端,都被模型化为文件,而所有的输入和输出都被当做想对应的文件的读写来执行。这种将设备优雅的映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口,称为UnixI/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。

      • 打开文件

        一个应用程序通过要求内核来打开文件,内核返回一个小的非负整数(描述符),内核记录有关这个文件的所有的信息,应用程序只需要记住这个描述符。

          Unix外壳创建的每个进程开始时都有三个打开的文件:
          标准输入(描述符为0)
          标准输出(描述符为1)
          标准错误(描述符为2)
          头文件:定义常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,用来代替显式的描述符
      • 改变当前的文件位置

        -对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个位置是从文件开头起始的字节偏移量。

        -应用程序可以通过seek操作显式的设置文件的当前位置为k。

      • 读写文件

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

        -给定一个大小为m字节的文件,k >= m 时执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测到这个条件,但是文件结尾处并没有明确的“EOF符号”。

        写操作就是从存储器拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。

      • 关闭文件

        -应用通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池当中。

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

    打开和关闭文件

    • 打开文件

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

         表示访问方式额外提示
         O_RDONLY:只读。
         O_WRONLY:只写。
         O_RDWR:可读可写。
        
         一位或者多位掩码的或
         O_CREAT,表示如果文件不存在,就创建它的一个截断的文件。
         O_TRUNC:如果文件已经存在,就截断它。
         O_APPEND:在每次写操作前,设置文件位置到文件的结尾处。
      • mode参数:指定新文件的访问权限位。作为上下文的一部分,每个进程都有一个umask,通过调用umask函数设置。当进程通过带某个带mode参数的open函数用来创建一个新文件的时候,文件的访问权限位被设置为mode & ~umask。

         给定mode和umask的默认值:
         #define DEF_MODE   S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
         #define DEF_UMASK  S_IWGRP|S_IWOTH
    • 关闭文件
      • 若成功则返回0,不成功则为-1。
      • 关闭一个已经关闭的描述符程序会出错。
      • 访问权限位。在sys/stat.h中定义

    读和写文件

    • 读函数

      #include<unistd.h>
      ssize_t read(int fd,void *buf,size_t n);
      若成功,返回读字节数,即实际传送的字节数量
      若EOF,返回0
      若出错,返回-1

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

    • 写函数

      #include<unistd.h>
      ssize_t write(int fd,const void *buf,size_t n);
      若成功,返回写的字节数
      若出错,返回-1

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

    • 不足值

      • 在某些情况下,read和write传送的字节比应用程序要求的要少,这些不表示有错误。

        读时遇到EOF。假设准备读一个文件,该文件从当前文件位置开始只含有20个字节,若以50个字节的片进行读取,下一个read返回的不足值为20,此后的read将通过返回不足值0来发出EOF信号。
        
        从终端读文本行。若打开文件与终端相关联(如键盘和显示器),那么每个read函数将以此传送一个文本行,返回的不足值等于文本行大小。
        
        读和写网络套接字。若打开的文件对应于网络套接字,内部缓冲约束和较长的网络延迟会引起read和write返回不足值。(进程间的通信机制:对Unix管道调用read和write时,也有可能出现不足值)
      • 实际上除了EOF,在读写磁盘文件时,不会遇到不足值。
      • 如果想创建健壮的诸如web服务器这样的网络应用,就必须通过反复调用read和write处理不足值,直到所有需要的字节都传送完毕。

    用RIO包健壮地读写

    • RIO包会自动处理不足值。RIO提供了两类不同的函数:
      • 无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲,对将二进制数据读写到网络和从网络读写二进制数据尤其有用。
      • 带缓冲的输入函数。这些函数允许高效地从文件中读取文本行和二进制数据(函数从内部缓冲区中拷贝一个文本行,当缓冲区变空的时候,会自动地调用read重新填满缓冲区),这些文件的内容缓存在应用级缓冲区内,类似于像printf这样的标准I/O函数提供的缓冲区。带缓冲的RIO输入函数是线程安全的,它在同一个描述符上可以被交错地调用。

    读取文件元数据

    • 应用程序能够通过调用stat和fstat函数,检索到关于文件的信息:元数据
      • stat函数以一个文件名作为输入
      • fstat函数以文件描述符作为输入
    • stat数据结构中的st_size成员包含了文件的字节数大小,st_mode成员编码了文件访问许可位和文件类型
    • 对于内核文本文件和二进制文件毫无区别

    共享文件

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

       描述符表:每个进程都它独立的描述符表,每个打来的描述符表指向文件表中的一个表项
       文件表:打开文件的集合是由一张文件表来表示的,所有的进程共享这张表
       v-node表:所有进程共享,每个表项包含stat结构中的大多数信息
    • 通过不同的打开文件表表项来引用两个不同的文件。没有共享文件,每个描述符对应一个不同的文件

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

    I/0重定向

    • Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
    • 重定向工作方式:使用dup2函数

       #include<unistd.h>
       int dup2(int oldfd,int newfd);
      • dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述表表项newfd以前的内容。
      • 若newfd已经打开,dup2会在拷贝oldfd之前关闭newfd。

    教材学习中的问题和解决过程

    打完练习题10.1的代码进行编译时不通过

    搜索到csapp.h是一堆头文件的打包,可以在http://csapp.cs.cmu.edu/public/code.html 下载

    代码托管截图

    代码托管

    代码量统计

    学习进度条

     代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)
    目标 3500行 30篇 300小时
    第一周 50/50 1/2 10/10
    第二周 120/170 1/3 20/30
    第三周 130/300 1/4 20/50
    第五周 130/430 2/6 25/75
    第六周 50/480 2/8 25/100
    第七周 53/533 1/9 20/120
    第八周 0/533 2/11 15/135
    第九周 68/601 2/13 20/155
  • 相关阅读:
    lseek 与 ioctl
    perror表
    阻塞&&非阻塞
    linux read/write
    文件i/o函数 open/close
    linux 文件io
    linux下的静态库和共享库
    linux基本命令
    c++ 2.1 编译器何时创建默认构造函数
    Java学习笔记34(sql基础 :增删改查1)
  • 原文地址:https://www.cnblogs.com/5321z/p/6059958.html
Copyright © 2011-2022 走看看