1.C标准文件IO工作位置:
理论上可在任何操作系统上运行,工作在操作系统之上
2.工作原理:
例如:printf先去调系统函数write,再去调内核中的函数,再去调驱动层
C标准库并不知道如何操作当前显示设备
它是通过操作系统,操作系统提供了应用层的API接口write。
应用层API自动向下调内核层API,内核层API知道如何操作显示设备
这就是为什么windows下的.exe放到linux下不能正常运行,因为没有相应的系统函数
需要把源代码在linux下重新编译。
APUE主要学习Linux(UNIX)应用层API
3.为什么要学习Linux系统API?
因为它和操作系统结合得更紧密,能做的事更强大。
更为重要的一点,在了解该概念之前,先回忆概念
(1)FILE结构体
C标准库三个流STDIN、STDOUT、STDERROR,
文件类型FILE*文件指针结构体的核心内容:
(1)文件描述符inode指向磁盘当中的真正的文件
(2)f_pos读写指针的位置,当操作一个文件读写到文件的哪个位置.
(3)buffer缓冲区指针,指向一个缓冲区,大小8192字节
当打开一个文件都会得到一个FILE结构体。
当对文件进行读写操作时,读写的是磁盘文件,通过文件描述符找到文件在磁盘上的位置,
读写数据时,不会直接往磁盘上写,而是先写到缓冲区。可以减少IO,提高效率。
C标准库为每个文件流指针创建一个缓冲区
标准输入、标准输出、标准出错分别对应三个缓冲区
(2)如何刷新缓冲区?
程序正常退出
缓冲区满了自动刷新
刷新缓冲区flush
\n刷新终端文件STDIN、STDOUT、STDERROR
所以第二个原因:
C标准文件都是都是携带了缓冲区的,
而缓冲区也是有利有弊的,网络IO等等我们不需要缓冲区
Linux提供的API没有缓冲区 (或者说但在write的底层也可以分配一个内核I/O缓冲区)
Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓
冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接
写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于
进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数
据从进程B也能读到,而C标准库的I/O缓冲区则不具有这一特性