20145331《信息安全系统设计基础》第9周学习总结
教材学习内容总结
10.1 Unix I/O
Unix中所有的I/O设备都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。
10.2打开关闭文件
1、打开文件:
int open(char *filename, int flags,mode_t mode);
其中,括号内第一个参数为文件名,第二个参数为访问文件的方式(3种),第三个参数为访问权限位(mode&~umask)。
2、关闭文件:
int close(int fd);
10.3读写文件
读:ssize_t read(int fd, void *buf, size_t n);
写:ssize_t write(int fd, const void *buf, size_t n);
注意ssize_t和size_t有区别。
10.3RIO包读写
1、RIO包会自动处理不足值。
2、分两类函数:无缓冲的输入输出函数 (二进制)、带缓冲的输入函数(二进制+文本行)。
3、第一类读写:
读:ssize_t rio_readn(int fd,void *usrbuf,size_t n);
写:ssize_t rio_writen(int fd,void *usrbuf,size_t n);
4、第二类读(三个函数):
带缓冲顾名思义就先联系缓冲区:
void rio_readinitb(rio_t *rp,int fd);
接着读:
ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen);
ssize_t rio_writen(rio_t *rp,void *usrbuf,size_t n);
10.5读文件元数据
1、文件元就是文件信息,调用stat和fstat函数检索到关于文件的信息
int stat(const char *filename,struct stat *buf);
int fstat(int fd,struct stat *buf);
2、其中st_size成员包含了文件的字节大小。st_mode为文件访问许可位。
10.6共享文件
1、三个结构:
描述符表:独立 文件表:多部分组成,进程共享。 v-node表:进程共享。 2、关键:每个描述符有自己的文件位置,不同操作符的读就可以从文件不同位置获取数据。
10.7I/O重定向
1、使用dup2函数重定向。
int dup2(int oidfd,int newfd);
2、这节看了很久,从例子入手后看懂了:以前两个描述符指向A、B两个文件,现在调用上述函数后,都指向一个文件(假如说是B),A就被关闭了,其文件表和v-node表删除,B的引用计数增加;以后的数据重定向到文件B。
10.8标准I/O
1、
标准I/O库(libc):高级输入输出函数
fopen/fclose:打开和关闭文件
fread/fwrite:读和写字节
fgets/fputs:读和写字符串
scanf/printf:复杂格式化的I/O函数
2、每个程序开始时都有三个打开的流:
stdin:标准输入
stdout:标准输出
stderr:标准错误
教材学习中遇到的问题:
10.1:
open函数返回值:若成功则为新文件的描述符,若出错则为-1
每个进程开始时都会打开三个文件:标准输入、标准输出、标准错误。它们的描述符分别为0、1、2。所以,fd1返回的描述符为3。之后调用了close函数,释放描述符3。所以fd2的返回值也就是描述符为3
10.2:
如图10-12。fd1和fd2对应不同的描述符表,也对应不同的文件表项,但是它们对应的v-note表一样,都是打开foobar.txt。所以读foobar的第一个字节,输出f
10.3:
如图10-13。首先你得知道子进程就相当于对父进程的复制,ok所以父进程中描述符表、文件表、v-note表对应关系和子进程一样。描述符fd在父子进程中指向同一个文件表项。因此子进程读完后,父进程读到的为o,输出o
10.4:
dup2(A,B)指将B重新定向到A,也是把A拷贝到B 标准输入的描述符为0
10.5:
dup2(fd2,fd1)将fd2拷贝到fd1,fd1被重新定向为fd2。所以再次执行read后,输出为o
代码中遇到的问题:
一开始编译书上p598的代码发现并没有“csapp.h”:
解决办法: 看到书p597的代码上面的头文件,进行尝试,成功编译并运行:
这三个头文件和“csapp.h”等价。
代码托管:
参照老师的评论本周代码托管做成了链接形式:
并用相关指令进行了统计:
心得体会:
内容看似很少,不过比以前的难懂,同样花了很多时间看书,我的心得是看这一章一定要学会找不同,这很关键;从下周起想重新学一下c语言,感觉现在看书上一些基本的代码很吃力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第7周 | 67/472 | 1/10 | 20/151 |