系统级I/O

 

 

输入/输出(I/O)


输入输出是在主存和外部设备之间拷贝数据的过程。

输入操作是从I/O设备拷贝数据到主存。

输出操作是从I/O主存拷贝数据到I/O设备。

 

与语言相关:

  1. ANSI C提供标准I/O库,包含像printf和scanf这样执行带缓冲区的I/O函数。
  2. C++语言用它的重载操作符<<输入和>>输出提供类似的过程

在UNIX系统中,是通过由内核提供的系统级I/O函数来实现这些较高级别的I/O函数的。

 

有时候你除了使用Unix I/O之外别无选择。在某些重要的情况下,使用高级别I/O函数不太可能或不太适合。例如标准I/O库没有提供读取文件元数据的方式,如文件大小或文件创建时间。另外,标准I/O库还存在一些问题,使得用它来进行网络编程非常危险。(比如哪一些?

  

Unix I/O


所有的I/O设备,如网络、磁盘和终端,都被模型化为文件,而所有的输入输出都被当作相对应文件的读和写来执行。这种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口,称为Unix I/O。

同时这也使得输入输出都能以一种统一且一致的方式来执行:

  • 打开文件
  • 改变当前文件位置
  • 读写文件
  • 关闭文件

 

描述符:内核返回一个小的非负整数。

内核纪录有关这个打开文件的所有信息。应用程序只需要记住这个描述符。

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

seek操作:对于每个打开的文件内核把持着一个文件位置k,初始值为0.应用程序能够通过执行seek操作显示地设置文件的当前位置为k。

end-of-file(EOF)条件:值得注意的是文件结尾处并没有明确的EOF符号。

读操作就是从文件拷贝n>0个字节到存储器,从文件当前位置开始,然后将k增加到k+n。给定当k大于或等于m时执行读操作会出发一个 EOF的条件。

作为关闭文件的响应,内核释放文件打开时创建的数据结构。并将这个描述符恢复到可用的描述符池中。

 

不足值 short count


 

在某些情况下,read和write传送的字节比应用程序要求的要少,这些不足值不表示有错误。

 

  • 读时遇到 EOF.这种情况发生在文件的大小小于单次读的大小。read将通过返回不足值0来发出EOF信号。
  • 从终端读取文本行。(这个不懂)
  • 读和写网络套接字(socket):内部缓冲区和较长的网络延迟会引起read喝write返回不足值。

 

想创建健壮可靠的注入web服务器这样的网络应用,就必须通过反复调用read和write处理不足值,直到所有需要的字节都传输完毕。

 

待补充的主题:

rio无缓冲/带缓冲的输入输出函数

读取元数据

共享文件

I/O重定向

 

 

 

 

 

 

 

 

 

posted on 2015-06-07 23:06  dotdog  阅读(263)  评论(0编辑  收藏  举报

导航