第10章 系统级I/O

10.1 Unix I/O

一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1

Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单、低级的应用接口,这使得所有的输入输出都能以一种统一且一致的方式来执行:

  • 打开文件:
  1. 内核返回一个小的非负整数,叫做描述符
  2. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。
  • 改变当前文件位置:
  1. 对于每个打开的文件,内核保持着一个文件位置K,初始为0。
  2. 这个文件位置是从文件开头起始的字节偏移量。
  3. 应用程序能够通过执行seek操作,显示地设置文件当前位置为K。
  • 读写文件:
  1. 读操作:从文件拷贝n>0个字节到存储器,从当前文件位置K开始,然后将K增加到k+n。
  2. 写操作:从存储器拷贝n>0个字节到一个文件,从当前文件位置K开始然后更新K 。
  • 关闭文件:

当应用完成了对文件的访问之后,他就通知内核关闭这个文件。

10.2 打开和关闭文件

进程通过调用open函数来打开一个已存在的文件或者创建一个新文件的:R

open函数将filename转换成一个文件描述符,并且返回描述符数字。返回的描述符总是在进程中没有打开的最小描述符。

Flags参数指明了进程打算如何访问这个文件:

  • O_RDONLY:只读
  • O_WRONLY:只写
  • O_RDWR:可读可写

Flags参数也可以是一个或者更多位掩码的或,为写提供给一些额外的指示:

  • O_CREAT:如果文件不存在,就创建它的一个截断的(空)文件。
  • O_TRUNC: 如果文件已经存在,就截断他。
  • O_APPEN D:在每次写操作前,设置文件位置到文件的结尾处。

Mode参数指定了新文件的访问权限位。

最后进程通过调用close函数关闭一个打开的文件。

关闭一个已关闭的描述符会出错。

10.3 读和写文件

应用程序是通过分别调用read和write函数来执行输入和输出的。

Read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。若返回值既不是0,也不是-1,则返回值表示的是实际传送的字节数量。

Write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。

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

  • 读时遇到EOF
  • 从终端读文本行
  • 读和写网络套接字(socket)

10. 4 RIO包健壮地读写

RIO包会自动为你处理上文中所述的不足值。

RIO提供了两类不同的函数:

  • 无缓冲的输入输出函数。
  • 带缓冲的输入函数。

10.4.1 RIO的无缓冲的输入输出函数

通过调用rio_readn和rio_writen函数,应用程序可以在存储器和文件之间直接传送数据。

注意:如果rio_readn和rio_writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动地重启read或write。

10.4.2 RIO的带缓冲的输入函数

另一种更好的方法就是调用一个包装函数(rio_readlineb)他从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区。

每打开一个描述符都会调用一次rio_ readlineb函数。它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。

RIO读程序的核心如下 rio_read函数:

10. 5 读取文件数据

应用程序能够通过调用stat 和 fstat函数,检索到关于文件的信息(元数据)。

Stat函数以一个文件名作为输入,并填写一个stat数据中的各个成员。Fstat函数是相似的,只不过是以文件描述符而不是文件名作为输入。

St_size 成员包含了文件的字节数大小。St_mode成员则编码了文件访问许可位和文件类型。Unix识别大量不同的文件类型。Unix提供的宏指令根据st_mode成员来确定文件的类型。

10. 6 共享文件

内核用三个相关的数据结构来表示打开的文件:

  • 描述符表。
  • 文件表。
  • V-node表。

第10章 系统级I/O的更多相关文章

  1. 第10章 系统级I/O(下)

    10.7  I/O重定向 Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输出输入联系起来. 例如:unix>ls>foo.txt,使得外壳加载和执行ls程序,将标准输出重定 ...

  2. JZ2440 裸机驱动 第10章 系统时钟和定时器

    本章目标      了解S3C2410/S3C2440的时钟体系结构     掌握通过设置MPLL改变系统时钟的方法     掌握在不同的频率下设置存储控制器的方法     掌握PWM定时器的用法   ...

  3. 系统级I/O学习记录

    重要知识点 输入/输出(I/O) I/O是主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. 输出操作是从主存拷贝到I/O设备. Unix I/O ...

  4. 深入理解计算机系统10——系统级I/O

    系统级I/O 输入/输出 是在主存和外部设备之间拷贝数据的过程. 外部设备可以是:磁盘驱动器.终端和网络. 输入和输出都是相对于主存而言的. 输入是从I/O设备拷贝数据到主存.输出时从主存拷贝数据到I ...

  5. 【译】x86程序员手册10 - 第4章系统架构

    1.1.2 Part II -- Systems Programming 系统编程 This part presents those aspects of the architecture that ...

  6. 系统级I/O 第八周11.1~11.8

    第十章 系统级I/O 输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程.输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备. 所有语言的运行时系统都提供执 ...

  7. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  8. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...

  9. JavaScript高级程序设计(第三版)学习笔记8、9、10章

    第8章,BOM BOM的核心对象是window,具有双重角色,既是js访问浏览器的一个接口,又是ECMAScript规定的Global对象.因此,在全局作用域中声明的函数.变量都会变成window对象 ...

随机推荐

  1. UVa 100 - The 3n + 1 problem(函数循环长度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  2. openstack 上床镜像, 创建网络, 创建虚拟机 命令

    ==================================================================================================== ...

  3. JavaScript Patterns 4.2 Callback Pattern

    function writeCode(callback) { // do something... callback(); // ... } function introduceBugs() { // ...

  4. 关于String对象的比较

    1.String对象的比较 String 是一个常量,从String类中的代码可以看出.String类内部是通过char数组来存储字符串,这个char数组是被声明成final的. // Java中只要 ...

  5. Linux objcopy命令

    一.简介 [功能] 将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换. [描述] objcopy工具使用BFD库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个 ...

  6. 【node.js】安装express后,'express' 不是内部或外部命令的问题

    因express默认安装是最新的版本,已经是4.x.x的版本.而最新express4.0+版本中将命令工具分出来了,所以必须要安装express-generator,执行: D:\TOOLS\Node ...

  7. 迅为iTOP-4412核心板调整电压

    本文转自:http://www.topeetboard.com iTOP-4412核心板使用的电源管理芯片是三星专门针对4412研发的S5M8767,8767提供9路BUCK和28路LDO输出,每路电 ...

  8. OpenStack在线迁移

    OpenStack迁移需要将虚拟机创建运行在共享存储上才可以进行迁移. 一.配置共享存储 1.环境 OpenStack三个节点icehouse-gre模式部署一文部署了的OpenStack环境. IP ...

  9. jQuery对象与dom对象的区别与相互转换

    什么是jQuery对象? 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的,其可以使用jQuery里的方法.例如: $("#test").htm ...

  10. 解决linux部署项目后,第一次访问初始化数据源的时候很慢的问题

    先说一下场景 测试环境是linux - centos6.5,项目是分布式的,分别搭建到linux上 数据货使用的是阿里巴巴数据源 每次重启后的第一次访问会比较慢,查看日志发现 卡在这个地方 ...{d ...