信息安全系统设计基础第9周学习总结
第十章 系统级I/O
10.1 UNIX I/O
1:系统级I/O
什么是UNIX I/O?
所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,
允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O。
2:输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程。
输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备。
3:打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的
所有操作中标识这个文件。内核记录有关这个打开文件的所有信息,头文件可用来代替显式的描述符。
UNIX外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)。
4:改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。
应用程序能够通过执行seek操作,显式地设置文件的当前位置为k。
3:读写文件:一个读操作就是从文件拷贝N个字节到存储器;给定一个大小为m字节的文件,当k大于等于m是会触发一个称为(EOF)的条件。
写操作就是从存储器拷贝n个字节到一个文件。
4:关闭文件,内核释放文件打开是创建的数据结构,并恢复描述符到描述符池中。
10.2 打开和关闭文件
进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件。
2:flags参数表示进程打算如何访问这个文件,它的值包括:O_RDONLY、O_WRONLY 、O_RDWR。
3:flags参数也可以是一个或者更多位掩码的或,提供一些额外的指示:O_CREAT、O_TRUNC:如果文件已经存在,就截断它,O_APPEND
4:mode参数指定了新文件的访问权限位。当进程通过带某个mode参数的open函数调用来创建一个新文件时,文件的访问权限位被设置为mode&umask。
5:关闭文件,应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。
10.3 读和写文件
应用程序是通过分别调用系统函数 read和write函数来执行输入和输出的。
返回值-1表示错误,0表示EOF;
在某些情况下,read和write传送的字节比应用程序要求的要少,称为:不足值。
出现这种情况的可能的原因有:如果打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会导致read和write返回不足值。
10.4 用rio包健壮地读写
RIO提供了两类不同的函数:无缓冲的输入输出函数和带缓冲的输入函数。
- 无缓冲的输入输出函数:直接在存储器和文件之间传送数据,对二进制数据在网络上读写尤其有用:因为对同一个描述符,可以任意交错地调用rio_ readn和rio_ writen,rio_ writen绝不会返回不足值。
- 带缓冲的输入函数:rio_ reanlineb从文件独处一个文本行,拷贝至存储器位置usrbuf,空字符以结束这个文本行(最多读取maxlen-1个字节);rio_ readnb从文件最多读n个字节到存储器位置usrbuf。
- 注意:如果rio_readn和rio_writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动地重启read或write。
10.5 读取文件元数据
1:文件的元数据:
a.应用程序能够通过调用stat和fstat函数检索到关于文件的信息。
b.stat以一个文件名为输入,并且填充buf结构体。
stat函数结构:st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位和文件类型。
c.fstat函数只不过是以文件描述符而不是文件名作为输入。
2:文件类型:普通文件,某种类型的二进制或文本数据;
目录文件:关于其他文件的信息;
套接字是一种用来通过网络与其他进程通信的文件。
3:Unix提供的宏指令根据st_mode成员来确定文件的类型。
10.6 共享文件
内核用三个相关数据结构来表示打开的文件:描述符表、文件表、v-node表。
描述符表: 每个进程都有其独立的描述符表,每个打开的该表表项指向文件表中的一个表项;
文件表:表示打开文件的集合,所有进程共享;
v-node表:进程共享,包含stat结构大多数信息。
多个描述符可以通过不同的文件表表项来引用同一个文件。
内核删除相应文件表表项之前,父子进程必须都关闭了它们的描述符。
10.7 I/O重定向
1:Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
2:I/O重定向的工作方式: 一种是使用dup2函数。
dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。
10.8 标准I/O
- ANSI C定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库(libc)提供了打开和关闭文件的函数(fopen和fclose)、读和写字节的函数(fread和fwrite)、读和写字符串的函数(fgets和fputs)、以及复杂的格式化I/O函数(printf和scanf)。
-
标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。