下载

0下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 《深入理解计算机系统》--系统级IO

《深入理解计算机系统》--系统级IO.doc

《深入理解计算机系统》--系统级IO

yang萍树
2017-10-10 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《《深入理解计算机系统》--系统级IOdoc》,可适用于IT/计算机领域

《深入理解计算机系统》系统级IO《深入理解计算机系统》系统级IO关于IO可以先参考这些文章但是这里可能还是有所不同。分析系统级别的IO有什么不一样的地方。文件IO高级IO标准库IO开篇介绍了三个级别的IO的区别之处。所有语言的运行时系统都提供执行IO的较高级别的工具。例如标准IO库在UNIX系统中是通过使用由内核提供的系统级IO函数来实现这些较高级别的IO函数的。介绍UNIXIO和标准IO的一般概念展示在C程序中如何可靠地使用它们。一、UNIXIO在UNIX系统中有一个说法一切皆文件。所有的IO设备如网络、磁盘都被模型化为文件而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式允许UNIX内核引出一个简单、低级的应用接口称为UNIXIO这使得所有的输入和输出都能以一种统一且一致的方式来执行。打开文件打开文件操作完成以后才能对文件进行一些列的操作打开完成过以后会返回一个文件描述符它在后续对此文件的所有操作中标识这个文件内核记录有关这个打开文件的所有信息。改变当前的文件位置。读写文件关闭文件应用完成了对文件的访问之后就通知内核关闭这个文件内核释放文件打开时创建的数据结构并将这个描述符恢复到可用的描述符池中。进程终止内核也会关闭所有打开的文件并释放他们的存储器资源。二、打开和关闭文件关于打开文件的基本操作这里就不再累述就是关于几个函数的解释在上面的三篇文章中有解释。intopen(char*filename,intflags,modetmode)其中打开标志flags有三种基本标志:ORDONLY、OWRONLY、ORDWR。也可以和其他三种(OCREAT、OTRUNC、OAPPEND)组合使用。mode参数指定了新文件的访问权限位。(这次终于看到完全的mode参数的使用方法了)剑道独尊wwwwocncom三、读和写文件在系统IO中读写文件用的系统函数为read()和write()函数来执行。cppviewplaincopy#include<unistdh>ssizetread(intfd,void*buf,sizetn)ssizetwrite(intfd,void*buf,sizetn)read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值表示一个错误而返回值表示EOF。否则返回值表示的是实际传送的字节数量。而write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。返回值要么为要么为写入的字节数目。cppviewplaincopy*$begincpstdin*#include"csapph"intmain(void){charcwhile(Read(STDINFILENO,c,)!=)Write(STDOUTFILENO,c,)exit()}*$endcpstdin*关于在文件中定位使用的函数为lseek在IO库中使用的函数为fseek。(ps:sizet和ssizet的区别前者是unsignedint而后者是int)有些情况下read和write传送的字节比应用程序要求的要少出现这种情况的原因如剑道独尊wwwwocncom下:读时遇到EOF。此时read返回来发出EOF信号。从终端读文本行。如果打开文件是与终端相关联那么每个read函数将以此传送一个文本行返回的不足值等于文本行的大小。读和写网络套接字。可能会出现阻塞现象。(我一定会在进程间通信的时候弄清楚这个事情的前前后后后后前前~~~)实际上除了EOF在读磁盘文件时将不会遇到不足值而且在写磁盘文件时也不会遇到不足值。然而如果你想创建健壮的网络应用就必须反复调用read和write处理不足值直到所有需要的字节都传送完毕。(这一点在UNIX网络编程中已经领略过了~~)四、用RIO包健壮地读写这个包会处理上面的不足RIO提供了方便、健壮和高效的IO。提供了两类不同的函数:无缓冲的输入输出函数直接在存储器和文件之间传送数据没有应用级缓冲它们对将二进制数据读写到网络和从网络读写二进制数据尤其有用。带缓冲的输入函数cppviewplaincopyssizetrioreadn(intfd,void*usrbuf,sizetn)ssizetriowriten(intfd,void*usrbuf,sizetn)对同一个描述符可以任意交错地调用rioreadn和riowriten。一个问本行的末尾都有一个换行符那么像读取一个文本中的行数怎么办使用read读取换行符这个方法不是很妥当可以调用一个包装函数(rioreadineb)它从一个内部读缓冲区拷贝一个文本行当缓冲区为空时会自动地调用read重新填满缓冲区。也就是说这些函数都是缓冲区操作而言的。五、读取文件元数据应用程序能够通过调用stat和fstat函数检索到关于文件的信息(有时也称为文件的元数据)cppviewplaincopy<spanstyle="fontfamily:KaiTiGBfontsize:px"><strong>#include<sysstath>#include<unistdh>intstat(constchar*filename,structstat*buf)intfstat(intfd,structstat*buf)<strong><span>若成功返回若出错则为stat以一个文件名为输入并且填充buf结构体。fstat函数只不过是以文件描述符而不是文件名作为输入。cppviewplaincopystructstat{#ifdefined(ARMEB)unsignedshortstdevunsignedshortpad#elseunsignedlongstdev剑道独尊wwwwocncom#endifunsignedlongstinounsignedshortstmodeunsignedshortstnlinkunsignedshortstuidunsignedshortstgid#ifdefined(ARMEB)unsignedshortstrdevunsignedshortpad#elseunsignedlongstrdev#endifunsignedlongstsizeunsignedlongstblksizeunsignedlongstblocksunsignedlongstatimeunsignedlongstatimensecunsignedlongstmtimeunsignedlongstmtimensecunsignedlongstctimeunsignedlongstctimensecunsignedlongunusedunsignedlongunused}其中stsize成员包含了文件的字节大小。stmode为文件访问许可位。UNIX提供的宏指令根据stmode成员来确定文件的类型:SISREG(),这是一个普通文件么SISDIR(),这是一个目录文件么SISSOCK()这是一个网络套接字么。使用一下这个函数cppviewplaincopy#include<stdioh>#include<stdlibh>#include<stringh>#include<sysstath>#include<systypesh>#include<unistdh>intmain(){intfd,sizestructstatbufstatmemset(bufstat,x,sizeof(bufstat))fd=stat("statc",bufstat)printf("dn",(int)bufstatstsize)return}六、共享问价剑道独尊wwwwocncom内核用三个相关的数据结构来表示打开的文件:描述符表(descriptortable)文件表(filetable)vnode表(vnodetable)下面通过几张图看一下父子进程是怎么共享文件的七、IO重定向八、标准IO九、IO使用的抉择方法剑道独尊wwwwocncom

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/7

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利