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


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

    教材学习内容总结

    系统级I/O

    输入/输出是在主存和外部设备之间拷贝数据的过程,输入操作是从I/O设备拷贝数据到主存,输出操作是从主存拷贝数据到I/O设备。

    Unix I/O

    Unix文件:m个字节的序列

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

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

    描述符:打开文件时,内核返回一个小的非负整数。 Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。 改变当前的文件位置:文件位置为k,初始为0。 seek操作:显式地设置文件的当前位置为k。

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

    关闭文件:内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的存储器资源。

    打开和关闭文件

    打开文件

    include <sys/types.h>

    include <sys/stat.h>

    include <fcntl.h>

    include <unistd.h>

    int open(char *filename,int flags,mod_it mode);

    若成功,返回值为新文件描述符

    若出错,返回值为-1

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

    fd = Open("文件名",flag参数,mode参数)

    fd是返回的文件描述符(数字),总是返回在进程中当前没有打开的最小描述符。

    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

    出错的时候返回-1

    关闭文件

    include<unistd.h>

    int close(int fd);

    若成功则返回0,不成功则为-1。

    关闭一个已经关闭的描述符程序会出错。

    访问权限位在sys/stat.h中定义

    读和写文件

    应用程序是通过分别调用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);

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

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

    include "csapp.h"

    int main(void)

    {

    char c;

    while(Read(STDIN_FILENO,&c,1) != 0)

    Write(STDOUT_FILENO,&c,1);

    exit(0);

    } 

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

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

    产生不足值的原因:

    读时遇到EOF

    从终端读文本行

    读和写网络套接字

    用RIO包读写

    RIO包的实质:I/O包

    RIO包提供的两种函数:无缓冲的输入输出函数、带缓冲的输入函数(线程安全)

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

    应用程序通过调用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函数绝不会返回不足值。

    RIO的带缓冲的输入函数

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

    实现计算文本文件中文本行的数量

    方法一:用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。这个方法的缺点是效率低,每读取文件中的一个字节都要求陷入内核。

    方法二:调用一个包装函数(rio_readlineb),它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区。

    对于既包含文本行也包含二进制数据的文件,书上提供了一个rio_readn带缓冲区的版本:

    rio_readnb,它从和rio_readlineb一样的读缓冲区中传送原始字节。

    rioreadinitb(riot *rp,int fd);

    • 每打开一个描述符都会调用一次该函数,它将描述符fd和地址rp处的类型为rio_t的缓冲区联系起来。

    rioreadnb(riot *rp,void *usrbuf,size_t n) ;

    • 从文件rp中最多读n个字节到存储器位置usrbuf。对同一描述符,rioreadnb和rioreadlineb的调用可以交叉进行。

    ssizet readlineb(riot *rp,void *usrbuf,size_t maxlen);

    • 从文件rp中读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并用空字符来结束这个文本行。

    RIO读程序的核心——rio_read函数

    读取文件元数据

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

    include <unistd.h>

    include <sys/stat.h>

    int stat(cost char *filename,struc sta *buf);

    int fstat(int fd,struct stat *buf);

    stat函数以文件名作为输入

    fstat函数以文件描述符作为输入

    st_size成员包含了文件的字节数大小

    st_mode成员编码了文件访问许可位和文件类型

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

    宏指令:

    S_ISREG() 普通文件?二进制或文本数据

    S_ISDIR() 目录文件?包含其他文件的信息

    S_ISSOCK() 网络套接字?通过网络和其他进程通信的文件

    共享文件

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

    描述符表:每个打开的描述符表项指向文件表中的一个表项

    文件表:所有进程共享这张表,每个表项包括文件位置,引用计数,以及一个指向v-node表对应表项的指针

    v-node表:所有进程共享这张表,包含stat结构中的大多数信息

    描述符各自引用不同的文件,没有共享文件。

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

    10.1

    代码出现了问题不能运行,后来上网查询,添加”stdlib.h”,将open所需的头文件加上,Open和Close都要小写。

    本周代码托管截图

    托管网址:

    https://git.oschina.net/null_363_2267/linux-besti-is-2016-2017-1-20145209

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90

    参考资料

  • 相关阅读:
    leetcode33. Search in Rotated Sorted Array
    pycharm 设置sublime text3 monokai主题
    django class Meta
    leetcode30, Substring With Concatenation Of All Words
    Sublime text3修改tab键为缩进为四个空格,
    sublime text3 python打开图像的问题
    安装上imesupport输入法依然不跟随的解决办法,
    sublime text3 的插件冲突弃用问题,
    sublime text3 BracketHighlighter括号匹配的设置
    windows 下wget的使用
  • 原文地址:https://www.cnblogs.com/liuyiyang/p/6059988.html
Copyright © 2020-2023  润新知