20145338 索朗卓嘎《信息安全系统设计基础》第9学习总结
教材学习内容总结
10.1 Unix I/O
(1)一个Unix文件就是一个m个字节的序列:B0,B1,B2,B3...Bk...Bm-1。
(2)所有的I/O设备,如网络、磁盘盒终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行。这是一种应用接口,成为Unix I/O。
这使得所有的输入和输出都能以一种统一且一致的方式来执行:
①打开文件
②改变当前的文件位置。
③读写文件。
④关闭文件。
(3)①输入是从I/O设备拷贝数据到主存,输出是从主存拷贝数据到I/O设备。
②一个文件就是一个字节序列。
③所有的I/O设备,如网络、磁盘、和终端,都被模型化为文件,而所有的输入和输出都被当做想对应的文件的读写来执行。
10.2 打开和关闭文件
(1)进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件的
include <sys/types.h>
include <sys/stat.h>
include <fcntl.h>
include <unistd.h>
(2)创建一个新文件,文件的拥有者有读写权限,而所有其他的用户都有读权限
umask(DEF_UMASK);
fg=Open("foo.txt",O_CREAT|O_TRUNC|O_WEONLY,DEF_MODE);
(3)通过调用close函数关闭一个打开的文件
int close(int fd);//返回值成功为0,出错为-1
10.3 读和写文件
(1)应用程序是通过分别调用read和write函数来执行输入和输出的
(2)read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf,返回值-1表示一个错误。而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量
(3)write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置
(4)通过调用lseek函数,应用程序能够显示地修改当前文件的位置
(5)在某些情况下,read和write传送的字节比应用程序要求的要少,这些不足值不表示有错误
①读时遇到EOF。假设我们猪呢比读一个文件,该文件从当前文件位置开始只含有20多个字节,而我们以50个字节的片进行读取。这样一来,下一个read返回的不足值为20,此后的read将通过返回不足值0来发出EOF信号。
②从终端读文本行。如果打开文件是与终端相关联的(如键盘和显示器),那么每个read函数将以此传送一个文本行,返回的不足值等于文本行的大小。
③读和写网络套接字。如果打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会引起read和write返回不足值。对Unix管道调用read和write时,也有可能出现不足值,这种进程间的通信机制不在我们讨论的范围之内。
实际上,除了EOF,在读磁盘文件时,将不会遇到不足值,而且在写磁盘文件时,也不会遇到不足值。如果想创建简装的诸如web服务器这样的网络应用,就必须通过反复调用read和write处理不足值,直到所有需要的字节都传送完毕。
10.4 用RIO包健壮地读写
(1)RIO包:健壮的包,会自动为你处理之前所述的不足值
RIO提供两种不同函数
①无缓冲的输入输出函数:这些函数直接在存储器和文件之间传送数据
通过调用rio_readn和writen函数
如果rio_readn和writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动重启rio_readn或writen
②带缓冲的输入函数:这些函数允许你高效的从文件中读取文本行和二进制数据
调用一个包装函数rio_readlineb,它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区
每打开一个描述符都会调用一次rio_readinitb函数
对同一描述符,对rio_readlineb和rio_readnb的调用可以交叉进行,对这些带缓冲的函数的调用却不应和无缓冲的rio_readn函数交叉使用
10.5 读取文件元数据
应用程序能够通过调用stat和fstat函数,检索到关于文件的信息:元数据
stat函数以一个文件名作为输入
fstat函数以文件描述符作为输入
stat数据结构中的st_size成员包含了文件的字节数大小,st_mode成员编码了文件访问许可位和文件类型
对于内核文本文件和二进制文件毫无区别
10.6 共享文件
内核用三个相关数据结构来表示打开的文件
描述符表
文件表
v-node表
10.7 I/0重定向
(1)Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
(2)重定向使用dup2函数
10.8 标准I/O
(1)Unix外壳提供I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
(2)I/O重定向工作:一种方式是使用dup2函数
(3)dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd