20145320 《信息安全系统设计基础》第9周学习总结
2016-11-13 17:00
281 查看
20145320 《信息安全系统设计基础》第9周学习总结
教材学习内容总结
输入/输出(I/O)是主存和外部设备(I/O设备)(如磁盘驱动器、终端、网络)之间拷贝数据的过程。输入是从I/O设备拷贝到主存。反之则反。10.1Unix I/O
Unix文件就是一个m字节的序列:b0,b1,b2….bm-1。所有的I/O设备都被虚拟化为文件。所有的输入输出都是在当成相对应的文件的读写。将设备映射为文件,Unix内核引出一个应用接口,Unix I/O。输入输出的执行方式:
打开文件:打开文件,内核会返回描述符。标准输入(STDIN_FILENO)描述符为0、标准输出(STDOUT_FILENO)描述符为1、标准错误(STDERR_FILENO)描述符为2。也就是说在Unix生命周期一开始,0、1、2就被占用,以后的open只能从3开始——习题10.1
改变当前文件位置:文件位置k,是文件开头起始的字节偏移量。
读写文件:读是从文件拷贝到存储器。写相反。当k超过文件字节数m时,会触发end-of-file(EOF)条件。
关闭文件:释放文件打开时创建的数据结构(释放文件的存储器资源),将描述符恢复到可用的描述符池中。
10.2打开和关闭文件
1.open函数(1)函数定义:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(char *filename, int flags, mode_t mode);
(2)参数解析:
返回值:类型为int型,返回的是描述符数字,总是在进程中当前没有打开的最小描述符。如果出错,返回值为-1.
filename:文件名
flags:指明进程打算如何访问这个文件,可以取的值见下:
O_RDONLY:只读 O_WRONLY:只写 O_RDWR:可读可写 O_CREAT:文件不存在,就创建新文件 O_TRUNC:如果文件存在,就截断它 O_APPEND:写操作前设置文件位置到结尾处 这些值可以用“或”连接起来。
mode:指定了新文件的访问权限位,符号名称如下:
2.close函数
(1)函数定义:
#include <unistd.h> int close(int fd);
(2)参数解析:
返回值:成功返回0,出错返回-1 关闭一个已经关闭的描述符会出错 fd:即文件的描述符。
10.3读和写文件
1.读 read(1)函数原型:
#include <unistd.h> ssize_t read(int fd, void *buf, size_t n);//返回有符号值
(2)参数解析:
返回值:成功则返回读的字节数,EOF返回0,出错返回-1。返回值为有符号数。 fd:文件描述符 buf:存储器位置 n:最多从当前文件位置拷贝n个字节到存储器位置buf
2.写 write
(1)函数原型:
#include <unistd.h> ssize_t write(int fd, void *buf, size_t n);
(2)参数解析:
返回值:成功则返回写的字节数,出错返回-1。返回值为有符号数。 fd:文件描述符 buf:存储器位置 n:最多从存储器位置buf拷贝n个字节到当前文件位置
需要注意的是,read和write在正常情况下返回值是实际传送的字节数量。
3.不足值
不足值指在某些情况下,read和write传送的字节比应用程序要求的要少,原因如下: 读的时候遇到EOF 从终端读文本行 读和写socket
10.4用RIO包健壮地读写
RIO包能自动地处理不足值。提供了两个函数:无缓冲的输入输出函数,带缓冲的输入函数。RIO的无缓冲的输入输出函数
这些函数的作用是直接在存储器和文件之间传送数据,常适用于网络和二进制数据之间。
rio_readn函数和rio_writen定义:
#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);
参数:
fd:文件描述符 usrbuf:存储器位置 n:传送的字节数
返回值:
rio_readn成功则返回传送的字节数,EOF为0(一个不足值),出错为-1 rio_writen成功则返回传送的字节数,出错为-1,没有不足值。
RIO的带缓冲的输入函数
可以高效的从文件中读取文本行和二进制数据。
文本行就是一个由换行符结尾的ASCII码字符序列。换行符数字值为0x0a.rio_readlineb函数从内部读缓冲区拷贝一个文本行,当缓冲区为空时,会自动地调用read重新填满缓冲区。rio_readn带缓冲区的版本:rio_readnb。
rio_readlineb从rp读出一个文本行(包括换行符)并把它存到usrbuf,并用空字符结束这个文本行。最多读maxlen-1个字节,剩下一个给结尾处的空字符。
rio_readnb最多读n个字节。
10.5读取文件元数据
检索文件元数据的方式:调用stat和fstat函数。两者功能相似。stat数据结构中的成员。重点掌握st_mode,st_size.
st_size:文件字节数大小 st_mode:文件访问许可位和文件类型。(普通文件:二进制文件和文本文件。目录文件:其他文件信息。套接字:通过网络与其他进程通信的文件。)
10.6共享文件
用三个相关的数据结构表示打开的文件:描述符表:每个打开的描述符表项指向文件表中的一个表项。
文件表:打开的文件的集合是由一张文件表表示的,所有的进程共享这张表。包括文件位置、引用计数(当前指向该表项的描述符表项数),指向v-node表的指针。
v-node表:包含stat结构中大多数信息。
打开文件的内核数据结构:
文件共享。共享了同一个磁盘文件:
子父进程共享文件。子进程有一个父进程描述表符副本,所以他们共享打开文件的集合。注意,在内核删除相应文件表表项之前,子父进程必须都关闭他们的描述符。
10.7 I/O重定向
I/O重定向操作符: >ls > foo.txt
这句代码的含义就是使外壳加载和执行ls程序,并且将标准输出重定向到磁盘文件foo.txt。
I/O重定向函数: dup2
函数定义为:
#include <unistd.h> int dup2(int oldfd, int newfd);
返回值:成功返回描述符,错误返回-1
- 这个函数执行的操作是,拷贝描述符表表项oldfd,覆盖描述表表项newfd,如果后者被打开,则在拷贝前关闭它。
10.8 标准I/O
标准I/O库:一组高级输入输出函数。将一个打开的文件模型化为一个流,一个流即一个指向FILE类型的结构的指针。 每个ANSI C程序开始时都有三个打开的流:stdin(标准输入),stdout(标准输出),stderr(标准错误)。 类型为FILE的流是对文件描述符和流缓冲区的抽象。为了减小系统开销。
10.9 综合:该使用哪些I/O函数
在网络套接字的时候使用RIO函数。需要格式化输出,使用sprintf函数格式化一个字符串,然后用rio_writen把它发送到套接口。 格式化输入,使用rio_readlineb读一个完整的文本行,再使用scanf从文本行提取不同字段。
教材练习
10.1
Unix进程生命周期开始时,打开的描述符赋给了stdin(描述符0)、stdout(描述符1)和stderr(描述符2)。open函数总是返回最低的未打开的描述符,所以第一次调用open会返回描述符3。调用close函数会释放描述符3.最后对open的调用会返回描述符3,因此程序的输出是“fd2=3”。10.2
描述符fd1和fd2都要各自的打开文件表表项,所以每个描述符对于foobar.txt都有它自己的位置。因此,从fd2的读操作会读取foobar.txt的第一个自己,并输出c=f ,而不是 c=o
10.3
这里是子进程继承父进程的描述符表,以及所有进程共享的同一个打开文件表。因此,描述符fd在父子进程中都指向同一个打开文件表表项。当子进程读取文件的一个字节时,文件位置加1.因此,父进程会读取第二个字节,而输出就是c=o,而不是10.2中的 c=f
10.4
这里考察的是重定向的内容,重定向标准输入(描述符0)到描述符5,直接调用dup2(5,0)10.5
这题考察重定向的应用,这里把fd1重定向到了fd2,输出应该为c=o
相关文章推荐
- 20145320 《信息安全系统设计基础》第2周学习总结
- 20145305 《信息安全系统设计基础》第9周学习总结
- 20145325张梓靖 《信息安全系统设计基础》第9周学习总结
- 20145328 《信息安全系统设计基础》第9周学习总结
- 20145236《信息安全系统设计基础》第9周学习总结
- 20145320《信息安全系统设计基础》第3周学习总结
- 20145214 《信息安全系统设计基础》第9周学习总结
- 20145223《信息安全系统设计基础》第9周学习总结
- 20145306《信息安全系统设计基础》第9周学习总结
- 20145330 《信息安全系统设计基础》第9周学习总结
- 20145221 《信息安全系统设计基础》第9周学习总结
- 20145320《信息安全系统设计基础》第六周学习总结
- 20145308 《信息安全系统设计基础》第9周学习总结
- 20145320 《信息安全系统设计基础》第5周学习总结
- 20145320 周岐浩《信息安全系统设计基础》第0周学习总结
- 20145320《信息安全系统设计基础》第7周学习总结
- 20145317《信息安全系统设计基础》第9周学习总结1
- 20145313张雪纯《信息安全系统设计基础》第9周学习总结
- 20145317《信息安全系统设计基础》第9周学习总结2
- 20145205 《信息安全系统设计基础》第9周学习总结