系统I/O

系统级I/O

  • 输入输出是在主存和外部设备之间的拷贝数据的过程。
  • 外部设备如磁盘,终端,网络等等
  • 输入是从I/o设备拷贝数据到主存
  • 输出是从主存拷贝数据到I/O设备

  • 所有语言的运行时系统都提供执行I/O的较高级的工具。
    1. C语言提供的标准的I/O库:printf scanf这样的带缓冲区的I/O函数
    2. c++重载操作符<< 输入>> 输出提供类似的功能
    3. UNIX系统当中使用内核提供的UNIXI/O函数实现。

UNIX I/O

  • ==内核实现== UNIX I/O
  • 所有的I/O设备网络磁盘终端都被映射为文件。
  • 文件就是一个m字节的序列。
  • 使得所有的输入和输出都能以一种统一一致的方式执行。
  • 一个应用程序要求内核打开相应的文件宣告想要访问一个I/O设备。内核返回一个小的非负的整数叫做描述符。后序对此文件的所有操作只需要==记住这个描述符==。
  • UNIX创建每个进程开始都会==有三个打开的文件==

    1. 标准输入 描述符为0
    2. 标准输出 描述符为1
    3. 标准错误 描述符为2
  • 改变当前文件的位置:对于每个打开的文件内核保持一个文件位置k初始值为0.这个位置是从文件开头的字节偏移量。应用程序可以通过==执行seek操作==显示的设置文件当前位置为k

  • 读写文件:读操作就是从文件拷贝n>0个字节到存储器。从当前文件位置k开始然后将k增加到k+n。给定一个大小为m字节的文件。当k>=m时执行读操作会触发一个称为EOF的条件应用程序可以检测到这个条件。==在文件的结尾处并没有明确的EOF符号==
  • 类似的写操作就是从存储器拷贝n>0个字节到一个文件从文件位置k开始然后更新k。
  • 关闭文件。程序通知内核关闭文件,内核释放文件打开时创建的数据结构并将描述符恢复到可用的描述符池当中。无论一个进程因为何等原因终止,内核都会关闭所有打开的文件释放存储器资源。
  • 不足值问题

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

  • RIO 健壮的I/O包 自动的处理上文当中的不足值。

    1. 无缓冲的输入输出函数 直接在存储器和文件之间传送数据
    2. 带缓冲的输入输出函数 类似printf 线程安全的
  • 一个文本行是由换行符结尾的ASCII码字符序列。

  • 一个包装函数rio_readlineb 从一个内部的读缓冲区拷贝一个文本行当缓冲区为空时会自动调用read填满缓冲区。
  • 应用程序能够通过stat 和 fstat函数检索到文件的信息 称为文件的元数据

共享文件

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

    1. 描述符表:每个进程都==有独立的描述符表==。他的表项是由进程打开的文件描述符索引的,每个打开的文件描述符指向文件表当中的一项。
    2. 文件表:打开的文件集合是由一张文件表来表示的==所有的进程共享这张表==。每个文件表的表项的组成:当前文件的位置,引用计数,一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应文件表表项当中的引用计数,直到这个引用计数为0内核才会删除这个表项。
    3. v-node表:所有的进程共享这张表。每个表项包含stat结构当中的大多数信息 包括st_size:包含文件的字节数的大小,st_mode编码了文件访问许可和文件类型。
  • 上面的组织方式就是一个数组套链表啊!!!!基本的数据结构

I/O 重定向

  • UNIX提供I/O重定向操作符 允许用户将磁盘文件和标准输入输出联系起来
  • 一种方式是使用dup2函数


  • 标准I/O库
  • 这个库提供了打开文件关闭文件的fopen和fclose
  • 读写字节的函数fread,fwrite
  • 读写字符串的函数fgets ,fputs
  • 复杂的格式化的I/O函数scanf printf
  • 标准I/O库将打开的文件模型化为一个流。
  • 一个流就是一个指向FILE类型的结构的指针
  • 每个C程序开始时都有三个打开的流 stdin stdout 和 stderr
  • 类型为FILE的流是对于文件描述符和流缓冲区的抽象
  • 缓冲区的目的是是使得开销较高的UNIX I/O系统调用数量尽量减少

简单来说:假如我们反复的调用getc函数每次调用返回文件的下一个字符当第一次调用getc时库通过调用一次read 函数来填满流缓冲区然后将缓冲区的第一个字节返回给程序只要缓冲区还有未读的字节接下来getc就能直接从缓冲区得到服务。

扫描二维码关注公众号,回复: 2366913 查看本文章

猜你喜欢

转载自blog.csdn.net/zhc_24/article/details/80815514