码迷,mamicode.com
首页 > 其他好文 > 详细

信息安全系统设计基础第八周学习总结-吕松鸿

时间:2015-11-08 17:53:38      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

第10章 系统级I/O

I/O:在主存和外部设备之间拷贝数据的过程。

10.1Unix I/O

一个Unix文件就是一个m个字节的序列:

        B0,B1,B2…Bk…B(m-1)

1.所有的输入输出都能以一种统一且一致的方式来执行:

(1)打开文件

a.描述符:内核返回一个小的非负整数,它在后续对此文件的所有操作中标识这个文件。

b. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。

(2)改变当前的文件设置。

(3)读写文件

end-of-file (EOF)

(4)关闭文件。

10.2打开和关闭文件

1.int open(char *filename, int  flags, mode_t mode)

2.open函数将filename转换为一个文件描述符。Flags参数指明了进程打算如何访问文件。O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(可读可写)、O_CREAT、O_TRUNC、O_APPEND。mode参数指定了新文件的访问权限位。

10.3读和写文件

1.  read函数:返回值-1表示一个错误;返回值0表示EOF
2.  write函数:成功返回写的字节数;出错返回-1.
3.  不足值:读时遇到EOF;从终端读文本行;读和写的套接字。

10.4用RIO包健壮的读写

RIO包会自动处理不足值。
1.RIO的无缓冲的输入输出函数:在存储器和文件之间直接传送数据。
2.RIO的带缓冲的输入函数:
3.调用包装函数(rio_readlineb),它从一个内部缓冲区拷贝一个文本行,当缓冲区变空时,会自动的调用read系统调用来重新填满缓冲区。在带缓冲区的版本中,每打开一个描述符都会调用一次rio_readinitb函数,它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。rio_readinitb函数从文件rp读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并且用空字符来结束这个文本行。

4.RIO读程序的核心是rio_read函数,rio_read函数可以看成是Unix read函数的带缓冲区的版本。当调用rio_read要求读取n个字节的时候,读缓冲区内有rp->rio_cnt个未读的字节。如果缓冲区为空的时候,就会调用read系统函数去填满缓冲区。这个read调用收到一个不足值的话并不是一个错误,只不过读缓冲区的是填充了一部分。一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝字节的数目。

10.5读取文件元数据

Int stat(const char *filename, struct stat *buf)

Int fstat(int fd ,struct stat *buf)

Stat以文件名作为输入,fstat以文件描述符作为输入

10.6共享文件

1.描述符表 文件表 v-node表

10.7 I/O重定向

1.unix>LS>foo.txt

使外壳加载和执行ls程序,将标准输出定向到磁盘文件

 

参考资料:《深入理解计算机系统》

信息安全系统设计基础第八周学习总结-吕松鸿

标签:

原文地址:http://www.cnblogs.com/lv-20135229/p/4947637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!