Loading

系统I/O函数与C标准库函数

先上图

库函数与系统调用的层次关系.png 系统IO函数与C标库函数.png

read、write函数常常被称为 Unbuffered I/O。指的是无用户输入级缓冲区,但不保证不使用内核缓冲区。

系统I/O与标准库I/O差异

用户程序在读写文件时既可以调用C标准I/O库函数,也可以直接调用底层的系统I/O函数,有什么区别呢?

  • 使用系统I/O函数每次读写都需要进入内核,调一个系统调用比调一个用户空间的函数要慢很多。(此时用户有必要维护一个I/O缓冲区,但用C标准I/O库函数就比较方便,省去了自己管理I/O缓冲区的麻烦)
  • 用C标准I/O库函数要时刻注意I/O缓冲区和实际文件有可能不一致,在必要时需调用fflush
  • UNIX是Everything is a file,在读写设备文件时通常是不希望有缓冲的,例如网络编程通常直接调用Unbuffered I/O函数。

标准库缓冲类型

C标准库的I/O缓冲区有三种类型:全缓冲、行缓冲和无缓冲。

全缓冲

如果缓冲区写满了就写回内核。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区。

行缓冲

如果用户程序写的数据中有换行符就把这一行写回内核,或者如果缓冲区写满了就写回内核。标准输入标准输出对应终端设备时通常是行缓冲的。

无缓冲

用户程序每次调库函数做写操作都要通过系统调用写回内核。

标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。这里的无缓冲,并不是指缓冲区大小为0,其实,还是有缓冲的,大小为1。

posted @ 2021-01-25 13:51  JakeLin  阅读(104)  评论(0编辑  收藏  举报