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


    教材学习内容总结

    输入/输出(I/O)是在主存和外部设备(如磁盘驱动器、终端和网络)之间拷贝数据的过程。输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备。

    10.1 Unix I/O
    •打开文件 •一个应用程序通过要求内核打开相应的文件 •描述符:内核返回一个小的非负整数 •定义常量: •STDIN_FILENO(描述符为0)
    •STDOUT_FILENO(描述符为1)
    •STDERR_FILENO(描述符为2)

    •改变当前的文件位置 •对于每个打开的文件,内核保持着一个文件位置k,初始为0
    •应用程序能够通过执行seek操作显示设置文件的当前位置为k

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

    •关闭文件
    •当应用完成了对文件的访问之后,他就通知内核关闭这个文件。

    10.2打开和关闭文件

    •打开文件:int open(char *filename, int flags, mode_t mode); •flags参数指明了进程打算如何访问这个文件: •O_RDONLY:只读
    •O_WRONLY:只写
    •O_RDWR:可读可写

    •flags参数也可以是一个或者更多位掩码的或: •O_CREAT:如果文件不存在,就创建它的一个截断的文件
    •O_TRUNC:如果文件已存在,就截断它
    •O_APPEND:在每次写操作前,设置文件的位置到文件的结尾处

    •mode参数指定了新文件的访问权限位,符号名字见书P598
    •习题10.1

    •关闭文件
    •int close(int fd);

    10.3读和写文件

    •应用程序是通过分别调用read和write函数来执行输入和输出的: •ssize_t read(int fd,void *buf, size_t n);
    •ssize_t write(int fd, const void *buf,size_t n);

    •某些情况下,read和write传送的字节比应用程序要求的要少,原因如下: •读时遇到EOF(end of file)
    •从终端读文本行

    •读和写网络套接字

    10.4 用RIO包健壮地读写

    •RIO包:健壮的包,会自动为你处理之前所述的不足值
    •RIO提供两种不同函数 •无缓冲的输入输出函数:这些函数直接在存储器和文件之间传送数据 •通过调用rio_readn和writen函数
    •如果rio_readn和writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动重启rio_readn或writen

    •带缓冲的输入函数:这些函数允许你高效的从文件中读取文本行和二进制数据 •调用一个包装函数rio_readlineb,它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区
    •每打开一个描述符都会调用一次rio_readinitb函数

    •对同一描述符,对rio_readlineb和rio_readnb的调用可以交叉进行,对这些带缓冲的函数的调用却不应和无缓冲的rio_readn函数交叉使用

    10.5 读取文件元数据

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

    •stat数据结构中的st_size成员包含了文件的字节数大小,st_mode成员编码了文件访问许可位和文件类型

    •对于内核文本文件和二进制文件毫无区别

    10.6 共享文件

    •内核用三个相关的数据结构来表示打开的文件: •描述符表:每个进程都它独立的描述符表,每个打来的描述符表指向文件表中的一个表项
    •文件表:打开文件的集合是由一张文件表来表示的,所有的进程共享这张表
    •v-node表:所有进程共享,每个表项包含stat结构中的大多数信息

    •通过不同的打开文件表表项来引用两个不同的文件《没有共享文件,每个描述符对应一个不同的文件
    •多个描述符也可以通过不同的文件表表项来引用同一个文件
    •父子进程共享文件

    •习题10.2 10.3

    10.7 I/O重定向

    •使用dup2函数 •int dup2(int oldfd,int newfd);
    •dup2函数拷贝描述符表表项oldfd到描述符表表项newfd

    •习题10.4 10.5

    10.8 标准I/O

    •标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构的指针
    •ANSI C程序开始时有三个打开的流:标准输入stdin、标准输出stdout和标准错误stderr

    •类型为FILE的流是对文件描述符和流缓冲区的抽象

    10.9综合

    •标准I/O函数是磁盘和终端设备I/O之选
    •标准I/O流限制

    •跟在输出函数之后的输入函数:在每个输入操作前刷新缓冲区

    代码行数(新增/累积)

    博客量(新增/累积)

    学习时间(新增/累积)

    重要成长

    目标 5000行 24篇 350小时
    第一周 0/0行 1/2 20小时
    第二周 53/53行 1/3 25/45小时
    第三周 130/183行 1/4 30/75小时
    第四周 0/183行 0/4 5/80小时
    第五周 158/341行 1/5 30/110小时
    第六周 84/425行 2/7 30/140小时
    第七周 209/634行 1/7 30/170小时
    第八周 0/634行 2/9 25/195小时
    第九周 83/717行 2/11 30/225小时

  • 相关阅读:
    echarts数据可视化之简单使用范例,
    配置用户/系统环境变量的意义与方法
    关于百度echarts数据可视化js插件基本使用样例
    python 博客引用
    泛型
    Java 关键字
    java基本知识点5
    Java 序列化
    java知识点4
    前端知识点总结1
  • 原文地址:https://www.cnblogs.com/bestizwh/p/6059230.html
Copyright © 2020-2023  润新知