我想了解glibc中fread()
和fwrite()
函数的缓冲是如何工作的。可以说,我正在使用fread()
和fwrite()
在随机位置阅读和撰写文件。当我读取某个偏移量时,读取调用中涉及的块被复制到glibc缓冲区中,对吗?然后如果我在文件中的另一个位置读取,这个缓冲区将替换为新数据,这是如何在glibc中缓冲工作的?我的意思是,只有一个缓冲区,数据从内核复制到缓冲区空间之外的任何fread()
/ fwrite()
上的用户空间。
我正在寻找的功能是,glibc将拥有N个缓冲区,并且能够保存我正在其内部空间中读取的块,因此当随机fread()
必须访问某个位置时文件,它不必使read()
系统调用再次读取磁盘块。这个功能是用glibc实现的,还是可能是另一个libc实现?
答案 0 :(得分:0)
作为使用标准库的程序员,您不应该关心它的实现细节。
如果你想研究它的当前实现,那么GNU libc的源代码是freely available。
也就是说,操作系统有效地处理I / O缓冲区,因此fread()
和fwrite()
通常不需要。
答案 1 :(得分:0)
依赖任何API的内部实现是非常危险的。不做任何其他假设,但只能从文档/规范/手册页中获取。其他事情可能会停止流动,你甚至不会知道这一点,因为内部变化不会影响API的记录行为。