信息安全系统设计基础第九周学习总结
第十章 系统级I/O
Unix识别大量文件:普通文件(二进制或者文本);目录文件爱你(包含其他文件的信息);套接字(网络和其他进程通信)。
描述符表:每个进程独有,每个进程打开的文件描述符表指向文件表中的一个表项。
文件表:打开的文件集合,所有进程共享。
v-node表:进程共享,每次打开都有。
IO重定向:
> 右hoinky <左hoinky
标准IO是磁盘和终端设备IO之选。
1.Unix I/O
所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O。
10.2 打开和关闭文件
打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。
基本标志:O_RDONLY、O_WRONLY、O_RDWR,也可以和其他三种(O_CREAT、O_TRUNC、O_APPEND)组合使用。
mode参数指定了新文件的访问权限位。
关闭文件
应用完成了对文件的访问之后,就通知内核关
闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。
10.3 读写文件
应用程序是通过分别调用系统函数 read和write函数来执行输入和输出的。
10.4 用rio包健壮地读写
RIO提供两类不同的函数:
无缓冲的输入输出函数
#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);
/*返回:若成功则为传送的字节数,若EOF则为0(只对rio_readn而言),若出错则为-1*/
rio_readn函数
从描述符fd的当前位置最多传送n个字节到存储器位置usrbuf,在遇到EOF时只能返回一个不足值
rio_writen函数
从位置usrbuf传送n个字节到描述符fd。决不会返回不足值。
带缓冲的输入函数
文本行就是一个由换行符结尾的ASCII码符序列。
#include "csapph.h"
void rio_readinitb(rio_t *rp,int fd)
ssize_t rio_readlined(rio_t,void *usrbuf,size_t maxlen)
ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n)
/*返回:若成功则为读的字节数,若为EOF则为0,若出错则为-1*/
10.5 读取文件元数据
文件的元数据
1.应用程序能够通过调用stat和fstat函数检索到关于文件的信息。
2.stat以一个文件名为输入,并且填充buf结构体。
3.fstat函数只不过是以文件描述符而不是文件名作为输入。
10.6 共享文件
内核用三个相关数据结构来表示打开的文件
10.7 I/O重定向
Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
I/O重定向的工作方式: 一种是使用dup2函数。
10.8 标准I/O