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

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

教材学习内容总结

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

  • Unix I/O是一个简单低级的应用接口,可以把所有的输入输出当作对文件的读写来执行。
    - 打开文件:标准输入描述符为0、标准输出描述符为1、标准错误描述符为2.
    - 改变当前的文件位置:文件位置是从文件开头起始的字节偏移量。
    - 读写文件:从当前文件位置开始。当大于文件长度的时候出发EOF条件。
    - 关闭文件。

  • open函数int open(char *filename,int flags,mode_t mode);
    - flages参数指明进程打算如何访问该文件O_RDONLY:只读O_WRONLY:只写O_RDWR:可读可写``O_CREAT:如果文件不存在就创建一个截断的(空)文件O_TRUNC:如果文件已经存在,就截断它。O_APPEND:每次写操作前,设置文件位置到文件的结尾处。
    - mode参数指定新文件的访问权限位,每个进程都有一个umask,是通过调用umask函数来设置的。当进程通过带某个mode参数的open函数调用来创建一个新文件时,文件的访问权限位被设置为mode & ~umask

        - 进程通过调用close函数关闭一个打开的文件:`int close(int fd);`
    
  • read函数:从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf,返回值-1表示错误,返回值0表示EOF。
    - readwrite传送的字节一般比应用程序要求的少,不足值产生的情况有:
    - 读时遇到EOF
    - 从终端读文本行
    - 读和写网络套接字

  • RIO包可自动处理不足值。 ssize_t rio_readn(int fd,void *usrbuf,size_t n);
    - 无缓冲的输入输出函数:直接在存储器和文件之间传送数据。
    - 带缓冲的输入函数:允许从文件中读取文本行和二进制数据,文件内容缓存在应用级缓冲区内。

  • 应用程序通过调用statint stat(const char *filename,struct stat *buf);和fststint fstat(int fd,struct stat *buf);

  • 函数检索关于文件的信息。

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

  • 本章内容是关于系统及I/O的知识点,在之前几章的学习都有所接触问题总的不大,但是在10.2中关于打开和关闭文件的open函数中的第三个参数的使用存在问题。书上p597写了一个例子,文件的拥有者有读写权限,而其他的用户都有读权限。而答案为什么给出的是umask(DEF _ UMASK);fd = Open("foo.txt",O _CREATE|O _TRUNC|O _WRONLY,DEF _MODE); 给出的O _WRONLY是只读,而并不是读写操作,是如何完成的读写操作?而其也具体的权限参数是什么?根据上面的解释知道是Open函数的第二个flags参数是指明了进程打算如何访问这个文件,第三个mode _t mode 参数是指明文件的访问权限,结合图10—1会知道具体的访问权限。后来通过看书,发现自己忽略掉了一点就是每个进程都有一个umask,它是通过调用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,这样在结合之前的Open函数就解决了我的问题。

代码调试中的问题和解决过程

  • 在完成练习题10.1时候出现了问题

    通过查询csapp.h是是一堆头文件的打包,linux应该没有自带csapp.h。于是更改了头文件,编译成功。

  • man k 命令的使用

本周代码托管截图

代码托管链接:https://git.oschina.net/20145335/Linux-besti-is-20145335

其他(感悟、思考等,可选)

本章的知识主要是关于I/O设备,这方面的知识在之前也都有所接触。所以有些理解起来比较方便,存在的问题多动手操作书上的例子都是可以得到解决的。虽然这些系统及I/O的知识对于编程看起来没有什么太大的帮助,但是对于理解计算机系统的确有着很大的作用,只有掌握了基本的知识,才能再此基础上运用更高一层的知识。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20 掌握核心的linux命令,了解了linux操作系统
第二周 300/500 2/4 18/38 学会了虚拟机上的C编程
第三周 500/1000 3/7 22/60 初步学习计算机中各种数的表示和运算
第五周 300/1300 2/9 30/90 通过学习汇编,了解逆向的思想应用
第六周 300/1500 2/11 28/110 安装了Y86处理器,了解了ISA抽象
第七周 150/1700 2/13 30/130 学习了存储器的体系结构|
第八周 200/1900 2/15 30/150 复习前7章知识
第九周 340/2100 1/17 31/170 学习了系统级I/O

参考资料

posted @ 2016-11-12 22:08  20145335郝昊  阅读(169)  评论(0编辑  收藏  举报