20145304 《信息安全系统设计基础》第九周学习总结
2016-11-13 21:07
274 查看
20145304 《信息安全系统设计基础》第九周学习总结
教材学习内容总结
Unix I/O
一个Unix文件就是一个m个字节的序列,所有的I/O设备都被模型化为文件,而所有的输入和输出都被当做对应文件的读和写来执行。打开文件。一个应用程序通过要求内核打开相应的文件来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,称为描述符,在后续对此文件的所有操作中标识这个文件。Unix外壳创建的每个进程开始时都有三个打开的文件,可以用来代替显式的描述符值。
改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。通过执行seek操作设置文件位置为k。
读写文件。读操作:从文件拷贝n>0个字节到存储器,从当前文件位置k开始,增加到k+n。当k>=文件长度大小时会触发一个称为end-of-file(EOF)的条件。写操作:从存储器拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。
关闭文件。内核释放文件打开时创建的数据结构。
打开和关闭文件
打开一个已存在的文件或者创建一个新文件int open(char *filename,int flags,mode_t mode); (若成功则返回新文件描述符,若出错为-1)
open函数将filename转换为一个文件描述符,并且返回描述符数字。
flags参数指明了进程如何访问文件。
mode参数指定了新文件的访问权限位。
关闭一个打开的文件
int close(int fd);(若成功则为0,若出错则为-1)
关闭一个已关闭的描述符会出错。
读和写文件
读文件:read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值表示实际传送的字节数量,错误返回-1,EOF返回0。ssize_t read(int fd, void *buf,size_t n);(若成功则返回读的字节数,若EOF则返回0,若出错为-1)
写文件:write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。
ssize_t write(int fd,const void *buf,size_t n);(若成功则返回写的字节数,若出错为-1)
不足值
在某些情况下,read和write传送的字节比应用程序要求的要少,这些不足值不表示有错误,出现这种情况的原因如下:读时遇到EOF:文件末尾剩余的字节数不足读取文件的字节片大小。
从终端读文本行:若打开文件与终端相关联,则每个read函数将一次传送一个问本行。返回的不足值等于文本行的大小。
读和写网络套接字(socket):若打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会引起read和write返回不足值。
用RIO包健壮地读写
RIO的无缓冲的输入输出函数
通过调用rio _ readn和rio _ writen函数,应用程序可以在存储器和文件之间直接传送数据。ssize_t rio_readn(int fd,void *usrbuf,size_t n); ssize_t rio_writen(int fd,void *usrbuf,size_t n); (若成功则返回传送成功的字节数,若EOF则为0(只对rio_readn而言),若出错 则为-1)
RIO的带缓冲的输入函数
rio _ readlineb和rio _ readnb函数从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。void rio_readinitb(rio_t *rp,int fd);(无返回) ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen); ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_n); (若成功则返回传送成功的字节数,若EOF则为0,若出错 则为-1)
打开每一个描述符都会调用一次rio _ readinitb函数,他将描述符fd和地址rp处的一个类型为rio _ t的读缓冲区联系起来。
带缓冲的函数的调用不应该和无缓冲的rio _ readn交叉使用。
读取文件原数据
应用程序能通过调用stat和fstat函数,检索到关于文件的信息(元数据)。stat函数以一个文件名作为输入,fstat函数以文件描述符作为输入。#include <unistd.h> #include <sys/stat.h> int stat(const char *filename,struct stat *buf); int fstat(int fd,struct stat *buf);
st _ size成员包含了文件的字节数大小。st _ mode成员则编码了文件访问许可位和文件类型。普通文件包括某种类型的二进制或文本数据。目录文件包含关于其他文件的信息。套接字是一种用来通过网络与其他进程通信的文件。
共享文件
内核用三个相关的数据结构来表示其打开的文件。描述符表:表项由进程打开的文件描述符来索引的,每个打开的描述符表指向文件表中的一个表项,每个进程有其独立的描述符表。
文件表:打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。包括:当前的文件位置、引用计数、以及一个指向v-node表中对应表项的指针。
v-node表:每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员,所有进程共享。
I/O重定向
I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。dup2函数拷贝描述符表表项oldfd到描述符表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd。
#include <unistd.h> int dup2(int oldfd,int newfd);
标准I/O
标准I/O库将一个打开的文件模型化为一个流,也就是一个指向FILE类型的结构的指针。#include <stdio.h> extern FILE *stdin; /*标准输入,文件描述符为0*/ extern FILE *stdout; /*标准输出,文件描述符为1*/ extern FILE *stderr; /*标准错误,文件描述符为2*/
类型为file的流是对文件描述符和流缓冲区的抽象,目的是使开销较高的Unix I/O系统调用的数量尽可能小。
错误处理
错误处理包装函数:给定某个基本的系统级函数foo,定义一个有相同参数的包装函数Foo。包装函数调用基本函数并检查错误。如果发现错误就打印一条信息并终止进程,否则返回调用者。即如果没有错误,包装函数的行为与基本函数完全一样。包装函数被封装在一个源文件(csapp.c)中,被编译和链接到每个程序中。
Unix风格的错误处理
函数返回值既包括错误代码又包括有用的结果。如果遇到错误就返回-1,并将全局变量errno设置为指明错误原因的错误代码。如果成功就返回有用的结果。if((pid = wait(NULL)) < 0) { fprintf(stderr,"wait error:%s\n",strerror(errno)); exit(0); }
Posix风格的错误处理
只用返回值来表明成功(0)或者失败(非0)。任何有用的结果都返回在通过引用传递进来的函数参数中。if((retcode = pthread_create(&tid,NULL,thread,NULL)) != 0) { fprintf(stderr,"pthread_create error:%s\n",strerror(retcode)); exit(0); }
DNS风格的错误处理
在失败时返回NULL指针,并设置全局变量h_errno。if((p = gethostbyname(name)) == NULL) { fprintf(stderr,"gethostbyname error:%s\n:",hstrerror(h_errno)); exit(0); }
man -k
grep
本周代码托管截图
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第五周 | 30/60 | 1/5 | 10/32 | |
第七周 | 0/160 | 1/7 | 8/48 | |
第八周 | 0/160 | 1/8 | 5/53 | |
第九周 | 157/317 | 1/9 | 7/60 |
参考资料
《深入理解计算机系统V2》学习指导相关文章推荐
- 20145304 《信息安全系统设计基础》第三周学习总结
- 20145234黄斐《信息安全系统设计基础》第九周学习总结(课本部分)
- 20145206 《信息安全系统设计基础》第九周学习总结
- 20145310《信息安全系统设计基础》第九周学习总结
- 20145240 《信息安全系统设计基础》第九周学习总结
- 20145304 《信息安全系统设计基础》第五周学习总结
- 20145311 《信息安全系统设计基础》第九周学习总结
- 20145329 《信息安全系统设计基础》第九周学习总结
- 20145227《信息安全系统设计基础》第九周学习总结
- 《信息安全系统设计基础》 第九周学习总结
- 20145321 《信息安全系统设计基础》第九周学习总结
- 20145304 《信息安全系统设计基础》第七周学习总结
- 20145327 《信息安全系统设计基础》第九周学习总结
- 20145304 《信息安全系统设计基础》第六周学习总结
- 20145304 《信息安全系统设计基础》第1周学习总结
- 《信息安全系统设计基础》第九周学习总结
- 20145208 《信息安全系统设计基础》第九周学习总结
- 20145215《信息安全系统设计基础》第九周学习总结
- 20145339 《信息安全系统设计基础》第九周学习总结
- 20145216史婧瑶《信息安全系统设计基础》第九周学习总结