您的位置:首页 > 其它

20135327郭皓——信息安全系统设计基础第九周学习总结

2015-11-06 20:45 369 查看
第九周(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重定向。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: