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。
-read
和write
传送的字节一般比应用程序要求的少,不足值产生的情况有:
- 读时遇到EOF
- 从终端读文本行
- 读和写网络套接字 -
RIO包可自动处理不足值。
ssize_t rio_readn(int fd,void *usrbuf,size_t n);
- 无缓冲的输入输出函数:直接在存储器和文件之间传送数据。
- 带缓冲的输入函数:允许从文件中读取文本行和二进制数据,文件内容缓存在应用级缓冲区内。 -
应用程序通过调用stat
int 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 |