如果程序的文件偏移量已然跨越了文件结尾,然后再执行IO操作,将会发生什么情况?
read调用将会返回0,表示文件结尾。令人惊讶的是,write函数可以在文件结尾后的任意位置写入数据。
从文件结尾后到新写入数据的这段空间被称为文件空洞。
从编程的角度来看,文件空洞是存在字节的,读取空洞将返回以0(空字节)填充的缓冲区。
然而,文件空洞不占用任何磁盘空间。知道后续某个时间点,在文件空洞中写入了数据,文件系统才会为之分配磁盘块。
文件空洞的优势在于,与为实际需要的空字节分配磁盘块相比,稀疏的填充文件会占用较少的磁盘空间。
核心转储文件(core dump)是包含文件空洞常见的例子。
对于文件空洞不占用磁盘空间的说法要稍微限定一下。在大多数的文件系统中,文件空间的分配是以块为单位的。块的大小取决于文件系统,通常是1024字节,2048字节,4096字节。如果空洞的边界落在块内,而非恰好落在块边界上,则会分配一个完整的块来存储数据,块中与空洞相关的部分则以空字节填充。
不支持文件空洞的文件系统会显式地将空字节写入文件。
空洞的存在意味着一个文件名义上的大小可能要比其占用的磁盘存储总量要大。
向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。
不太理解的是空洞落在块内和落在块的边界上,我倒是理解了,但是不知道对不对。
原文地址:https://www.cnblogs.com/tuhooo/p/8642039.html
时间: 2024-11-07 23:23:37