文件操作之标准IO与系统IO

文件操作之标准IO与系统IO

文件操作既可以用系统IO实现,也可以用标准IO实现,那二者又有和联系和区别呢?

联系

  • 标准IO的实质是调用系统IO完成文件操作,即标准IO的执行依附于系统IO。

区别

  • 系统IO是低级IO,通过API直接与操作系统内核进行操作,标准IO属于C库,在用户空间的可移植性强。

  • 标准IO在打开文件时候就会建立起缓冲区,缓冲区有三种模式。而系统IO没有,需要手动创建。

  • 数据流向

    • 无缓存IO操作数据流向路径:数据–内核缓存区–磁盘
    • 标准IO操作数据流向路径:数据–流缓存区–内核缓存区–磁盘

详解

  • 标准 I/O 库就是带缓存的 I/O,它由 ANSI C 标准说明。当然,标准 I/O 最终都会调用上面的 I/O 例程。标准 I/O 库代替用户处理很多细节,比如缓存分配、以优化长度执行I/O等。

  • 标准 I/O 提供缓存的目的就是减少调用 read 和 write 的次数,它对每个 I/O 流自动进行缓存管理(标准 I/O 函数通常调用 malloc 来分配缓存)。它提供了三种类型的缓存:

    1. 全缓存:当填满标准 I/O 缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。
    2. 行缓存:当输入输出遇到新行符或缓存满时,才由标准 I/O 库执行实际 I/O 操作。stdin、stdout 通常是行缓存的。
    3. 无缓存:stderr 通常是无缓存的,因为它必须尽快输出。
  • 一般而言,由系统选择缓存的长度,并自动分配。标准 I/O 库在关闭流的时候自动释放缓存。

  • 在标准 I/O 库中,一个效率不高的不足之处是需要复制的数据量。每使用一次函数 fgets 和 fputs 时,通常需要复制两次数据:一次是在内核和标准 I/O缓存之间(当调用 read 和 write 时),第二次是在标准 I/O 缓存(通常系统分配和管理)和用户程序中的行缓存( fgets 的参数就需要一个用户行缓存指针)之间。

  • 使用标准 I/O例程的一个优点是无需考虑缓存及最佳I/O长度的选择,并且它并不比直接调用read、write慢多少。

你可能感兴趣的:(Linux,C)