• 20135203齐岳 信息安全系统设计基础第九周学习总结


    20135203齐岳 信息安全系统设计基础第九周学习总结

    学习计时(预计/实际):

    • 读书:2/2.5

    • 代码:1/3

    • 作业:30min/45min

    • 博客:1/1
      (这周在运行家庭作业的代码时对csapp.h的处理中遇到了一些问题,导致用时过长)

    第十章 系统级 I/O

    一、学习目标

    1. 掌握系统编程和系统调用的概念
    2. 掌握系统编程错误处理的方式
    3. 掌握Unix/Linux系统级I/O:open close read write seek stat
    4. 掌握RIO
    5. 掌握I/O重定向的方法

    二、学习任务

    1. 阅读教材,注意每个系统调用的参数、返回值,会查帮助文档
      完成课后练习(书中有参考答案)重点:10.1、10.2、10.3、10.4、10.5
      2.重要命令:
      man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
      grep -nr XXX /usr/include :查找宏定义,类型定义
    2. 考核:教材内容,练习题把数据变换一下
    3. 实验:需要动手的到实验楼中练习一下

    三、学习过程

    10.1 Unix I/O

    输入输出(I/O)是在主存和外部设备之间拷贝数据的过程。一个Unix文件就是一个m个字节的序列,所有的I/O设备都被模型化为文件,而所有的输入和输出都被当做对应文件的读和写来执行。

    • 打开文件。一个应用程序通过要求内核打开相应的文件来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,称为描述符,在后续对此文件的所有操作中标识这个文件。

    Unix外壳创建的每个进程开始时都有三个打开的文件,可以用来

    • 改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。通过执行seek操作设置文件位置为k。

    • 读写文件。读操作:从文件拷贝n>0个字节到存储器,从当前文件位置k开始,增加到k+n。当k>=文件长度大小时会触发一个称为end-of-file(EOF)的条件。写操作:从存储器拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。

    • 关闭文件。内核释放文件打开时创建的数据结构。

    10.2 打开和关闭文件

    打开一个已存在的文件或者创建一个新文件:

    int open(char *filename,int flags,mode_t mode) (若成功则返回新文件描述符,若出错为-1)
    
    • open函数将filename转换为一个文件描述符,并且返回描述符数字。
    • flags参数指明了进程如何访问文件。
    • mode参数指定了新文件的访问权限位。

    关闭一个打开的文件:

    int close(int fd)(若成功则为0,若出错则为-1)
    

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

    10.3 读和写文件

    • 读文件:read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值表示实际传送的字节数量,错误返回-1,EOF返回0。

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

    不足值

    • 读时遇到EOF:文件末尾剩余的字节数不足读取文件的字节片大小。

    • 从终端读文本行:若打开文件与终端相关联,则每个read函数将一次传送一个问本行。返回的不足值等于文本行的大小。

    • 读和写网络套接字(socket):若打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会引起read和write返回不足值。

    10.4 用RIO包健壮地读写

    RIO的无缓冲的输入输出函数

    通过调用rio _ readnrio _ writen函数,应用程序可以在存储器和文件之间直接传送数
    据。

    ssize_t rio_readn(int fd,void *usrbuf,size_t n);
    ssize_t rio_writen(int fd,void *usrbuf,size_t n);
    (若成功则返回传送成功的字节数,若EOF则为0(只对rio_readn而言),若出错 则为-1)
    

    RIO的带缓冲的输入函数

    rio _ readlinebrio _ readnb函数从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。

    void rio_readinitb(rio_t *rp,int fd);(无返回)
    
    ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen);
    ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_n);
    (若成功则返回传送成功的字节数,若EOF则为0,若出错 则为-1)
    

    打开每一个描述符都会调用一次rio _ readinitb函数,他将描述符fd和地址rp处的一个类型为rio _ t的读缓冲区联系起来。

    带缓冲的函数的调用不应该和无缓冲的rio _ readn交叉使用。

    10.5 读取文件元数据

    • 应用程序能通过调用stat和fstat函数,检索到关于文件的信息(元数据)。stat函数以一个文件名作为输入,fstat函数以文件描述符作为输入。

        #include <unistd.h>
        #include <sys/stat.h>
      
        int stat(const char *filename,struct stat *buf);
        int fstat(int fd,struct stat *buf);
      
    • st _ size成员包含了文件的字节数大小。st _ mode成员则编码了文件访问许可位和文件类型。

      • 普通文件包括某种类型的二进制或文本数据。

      • 目录文件包含关于其他文件的信息。

      • 套接字是一种用来通过网络与其他进程通信的文件。

    10.6 共享文件

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

    • 描述符表:表项由进程打开的文件描述符来索引的,每个打开的描述符表指向文件表中的一个表项,每个进程有其独立的描述符表。

    • 文件表:打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。包括:当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针。

    • v-node表:每个表项包含stat结构中的大多数信息,;包括st_mode和st_size成员,所有进程共享。

    10.7 I/O重定向

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

    dup2函数拷贝描述符表表项oldfd到描述符表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd。

    #include <unistd.h>
    
    int dup2(int oldfd,int newfd);
    

    10.8 标准I/O

    标准I/O库将一个打开的文件模型化为一个流,也就是一个指向FILE类型的结构的指针。

    #include <stdio.h>
    extern FILE *stdin;  /*标准输入,文件描述符为0*/
    extern FILE *stdout;  /*标准输出,文件描述符为1*/
    extern FILE *stderr;  /*标准错误,文件描述符为2*/
    

    类型为file的流是对文件描述符和流缓冲区的抽象,目的是使开销较高的Unix I/O系统调用的数量尽可能小。

    四、遇到的问题

    1.flags参数:

    O_ CERAT:如果文件不存在就创建它的一个截断的(空)文件。

    O_TRUNC:如果文件已经存在,就截断它。

    当中的“截断”是什么含义?和删除的区别是什么?写文件时设置这样的标志位有何意义?

    有时候我们需要在文件尾端处截取一些数据以缩短文件。文件清空为0,是一个特例。在打开文件时候使用O_TRUNC标志就可以做到这一点。文件没有被删除。

    #include <unistd.h>  
    int truncate(const char* pathname,off_t length)  
    int ftruncate(int filedes,off_t length);  
    若成功则返回0,出错则返回-1
    

    2.读文件时遇到不足值对网络通信的影响?

    3.csapp.h
    将csapp.h放到/usr/include目录下之后仍显示Open error: No such file or directory

    参考资料

    《深入理解计算机系统》

    《深入理解计算机中的 csapp,h和csapp.c》 http://www.cnblogs.com/LZYY/p/3423594.html

    Instructor Site: Code Examples:http://csapp.cs.cmu.edu/public/code.html

    《unix环境高级编程-文件长度与截断》http://blog.csdn.net/wallwind/article/details/6895400

  • 相关阅读:
    蓝牙的发展史及版本演进
    linux下tar.bz2文件的 解压缩方法
    一个简单的C语言题背后的故事
    thinkpad的E480安装ubuntu后wifi无法使用问题解决
    Linux 上的常用文件传输方式介绍与比较
    一个linux内核编译时遇到的perl语法导致的编译问题解决
    自省是最好的导师
    ....................................thinkpad E480 用户初体验..............................
    使用diskpart命令格式化U盘
    了解甚少的GNU C的__attribute__ 机制
  • 原文地址:https://www.cnblogs.com/July0207/p/4947427.html
Copyright © 2020-2023  润新知