20135327郭皓——信息安全系统设计基础第九周学习总结
第九周(11.02-11.08):
学习计时:共4小时 读书: 代码: 作业: 博客: |
一、学习目标 |
1. 掌握系统编程和系统调用的概念 2. 掌握系统编程错误处理的方式 3. 掌握Unix/Linux系统级I/O:open close read write seek stat 4. 掌握RIO 5. 掌握I/O重定向的方法 |
第十章 系统级I/O
- 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程。
10.1 Unix I/O
- 一个Unix文件就是一个m个字节的序列B0,B1,···,Bk,···,Bm-1
- 所有I/O设备,如网络、磁盘和终端,都被模型化为文件,而所有的输入和输出都被当做对应文件的读和写来执行。
- 这种将设备优雅的映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口,称为UnixI/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:
- 打开文件。一个应用程序通过要求内核打开相应的文件,来宣告他想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符。Unix外壳创建每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)
- 改变当前文件位置。对于每个打开的文件,内核保持着一个文件k,初始为0.
- 读写文件。一个读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。写操作就是从文件拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。
- 关闭文件
10.2 打开和关闭文件
-
进程就是通过调用open函数来打开或者创建一个新文件的
-
open函数将filename转换为一个文件描述符,并返回描述符数字。flags参数指明了进程打算如何访问这个文件:
- O_RDONLY:只读。
- O_WRONLY:只写。
- O_RDWR:可读可写。
- flags参数也可以是一个或者更多位掩码的或,为写提供给一些额外的指示:
- O_CREAT:如果文件不存在,就创建它的一个截断的文件。
- O_TRUNC:如果文件已经存在,就截断它。
- O_APPEND:在每次操作前,设置文件位值到文件的结尾处。
- mode参数制定了新文件的访问权限位:
- 最后,进程通过调用close函数关闭一个打开的文件。
10.3 读和写文件
- 应用程序是通过分别调用read和write函数来执行输入和输出的。
- read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节。
- write函数从存储器位置buf拷贝之多n个字节到描述符fd的当前文件位置。
- 通过调用lseek函数,应用程序能够显示的修饰当前文件的位置。
- 在某些情况下,read和write传送的字节比应用程序要求的要少。这些不足值不表示有错误。出现这种情况的原因:
- 读时遇到EOF
- 从终端读文本行
- 读和写网络套接字
10.4 用RIO包健壮地读写
- 一个I/O包,RIO包,它会自动为你处理上文中所述的不足值。
- RIO提供了两类不同的函数:
- 无缓冲的输入输出函数。
- 带缓冲的输入函数。
10.4.1 RIO的无缓冲的输入输出函数
- 通过调用rioreadn和riowriten函数,应用程序可以在存储器和文件之间直接传送数据。
- rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。
- rio_writen函数从位置usrbuf传送n个字节到描述符fd。
10.4.2 RIO的带缓冲的输入函数
暂时没看懂,后面会继续学习。
10.5 读取文件元数据
- 应用程序能够通过调用stat和fstat函数,检索到关于文件的信息
- stat函数以一个文件名作为输入,并填写如下图所示的一个stat数据结构中的各个成员
- fstat函数是相似的,只不过是以文件描述符而不是文件名作为输入
-
stat数据结构中的stmode和stsize成员;stsize成员包含了文件的字节数大小。stmode成员则编码了文件访问许可位和文件类型
- 普通文件:某种类型的二进制或文本数据。
- 目录文件:包含关于其他文件的信息。
- 套接字:一种用来通过网络与其他进程通信的文件。
10.6 共享文件
- 内核用三个相关的数据结构来表示打开的文件:
- 描述符表
- 文件表
- v-node表
10.7 I/O重定向
- Unix外壳提供I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
- I/O重定向工作:一种方式是使用dup2函数
- dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd
小结
Unix提供少量的系统级函数,它们允许应用程序打开、关闭、读和写文件,提取文件的元数据,以及I/O重定向。应用程序不应直接调用UnixI/O函数,而应该使用RIO包,RIO包通过反复执行读写操作,直到传送完所有的请求数据,自动处理不足值。Unix内核使用三个相关的数据结构来表示打开文件。理解这些结构的一般组成就能使我们清楚地理解文件共享和I/O重定向。