linux下IO工作机制

        每一个FILE文件流(输出流、输入流、错误流)都有一个缓冲区buffer,默认大小8192Byte。

        每一个文件流都有三个部分组成:文件描述符 、位置指针、缓冲区buffer。如下图右边所示

        我们平时写程序用到的都是c标准函数,我们并不清楚在操作系统中怎么处理我们的输入的,下面就以printf来距离说明:

假如现在有程序A需要向屏幕输出hello,首先程序A调用printf,我们写入的hello存入c标准的缓存区。当刷新之后将其送入操作系统中,操作系统也有一个内核缓冲区。当数据送入操作系统之后,应用层write的将其放入操作系统的缓冲区,当达到一定数量,或者通过守护进程(可以定时刷新)进行输出之后,将hello从内核缓冲区通过内核层sys_write送入显示设备。

      当应用程序A输入hello完成时,应用程序B去读取hello,能够读的到吗?

这就得看我上面的分析了,应用程序A输入完成返回只是表明已经将hello送入了操作系统,而没有显示设备。但是对于应用程序B来说是希望能读取的到的,所以操作系统有一个机制,就是让B直接从操作系统的内核缓冲区中读取。

注意:c标准缓冲区是每个程序都有的,A程序的缓冲区B是看不见的,但是在内核缓冲区是共有的。所以A写入的B可见。(所以这就是为什么B程序没有直接读取c标准缓存区,而去读取内和缓冲区)。

猜你喜欢

转载自blog.csdn.net/qianyayun19921028/article/details/81321557