20135327郭皓——信息安全系统设计基础第九周学习总结
2015-11-06 20:45
369 查看
第九周(11.02-11.08):
所有I/O设备,如网络、磁盘和终端,都被模型化为文件,而所有的输入和输出都被当做对应文件的读和写来执行。
这种将设备优雅的映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口,称为UnixI/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:
打开文件。一个应用程序通过要求内核打开相应的文件,来宣告他想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符。Unix外壳创建每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)
改变当前文件位置。对于每个打开的文件,内核保持着一个文件k,初始为0.
读写文件。一个读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。写操作就是从文件拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k。
关闭文件
open函数将filename转换为一个文件描述符,并返回描述符数字。flags参数指明了进程打算如何访问这个文件:
O_RDONLY:只读。
O_WRONLY:只写。
O_RDWR:可读可写。
flags参数也可以是一个或者更多位掩码的或,为写提供给一些额外的指示:
O_CREAT:如果文件不存在,就创建它的一个截断的文件。
O_TRUNC:如果文件已经存在,就截断它。
O_APPEND:在每次操作前,设置文件位值到文件的结尾处。
mode参数制定了新文件的访问权限位:
最后,进程通过调用close函数关闭一个打开的文件。
read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节。
write函数从存储器位置buf拷贝之多n个字节到描述符fd的当前文件位置。
通过调用lseek函数,应用程序能够显示的修饰当前文件的位置。
在某些情况下,read和write传送的字节比应用程序要求的要少。这些不足值不表示有错误。出现这种情况的原因:
读时遇到EOF
从终端读文本行
读和写网络套接字
RIO提供了两类不同的函数:
无缓冲的输入输出函数。
带缓冲的输入函数。
rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。
rio_writen函数从位置usrbuf传送n个字节到描述符fd。
stat函数以一个文件名作为输入,并填写如下图所示的一个stat数据结构中的各个成员
fstat函数是相似的,只不过是以文件描述符而不是文件名作为输入
stat数据结构中的stmode和stsize成员;stsize成员包含了文件的字节数大小。stmode成员则编码了文件访问许可位和文件类型
普通文件:某种类型的二进制或文本数据。
目录文件:包含关于其他文件的信息。
套接字:一种用来通过网络与其他进程通信的文件。
描述符表
文件表
v-node表
I/O重定向工作:一种方式是使用dup2函数
dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd
学习计时:共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重定向。相关文章推荐
- sipXecs安装完成后,登录地址
- 组合框自动记录
- 一个大四学生眼中的顶尖程序员是什么样子的?
- "Server Tomcat v7.0 Server at localhost failed to start"的错误解决
- SpringMVC 学习系列 (11) 之 表单标签
- SpringMVC 学习系列 (10) 之 异常处理
- 论文写作经验 集萃
- 锋利的jQuery--Ajax(读书笔记四)
- 如何将python中的数据写到mysql数据库中
- sipXecs在虚拟机中运行的网络设置
- poj 1860 Currency Exchange
- SpringMVC 学习系列 (9) 之 实现注解式权限验证
- leetcode-Remove Duplicates from Sorted Array
- android studio 安装过程中intelhaxm-android不能安装的解决办法s
- 一个简易的指南针
- 【Codeforces Round 329 (Div 2) D】【LCA+并查集路径压缩】Happy Tree Party 除上两点间路径全部权值
- SpringMVC 学习系列 (8) 之 国际化
- Java程序员进化为架构师掌握的知识
- 纯SystemC设计吃进Questasim10.2c时遇到的问题
- 用ssh登陆远端主机