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重定向。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
posted @ 2015-11-06 20:45  20135327郭皓  阅读(160)  评论(0编辑  收藏  举报