一、什么是空洞文件?
+=======+-------+====+
start end a b
定义:从文件结尾到新写入的文件之间的这段空间被称之为:文件空洞,如上图中从end到a之间的一段就是文件空洞。
空洞文件必须满足2个条件:
(1)写文件时超出文件结尾
(2)超出之后继续写文件
lseek()系统调用可以改变文件的偏移量,但如果程序调用使得文件偏移量跨越了文件结尾,然后再执行I/O操作,将会发生什么情况? read()调用将会返回0,表示文件结尾。令人惊讶的是,write()函数可以在文件结尾后的任意位置写入数据
文件空洞不会占用任何磁盘块,当在文件空洞中写入了数据时,文件系统才会为之分配磁盘块。空洞的存在意味着一个文件名义上的大小可能要比其占用的磁盘存储总量要大(有时大出许多)。向文件空洞中写入字节,内核需要为其分配存储单元,即使文件大小不变,系统的可用磁盘空间也将减少。
常用命令如下,可见du命令可以查看一个文件准确的占用磁盘空间的大小,ls -l 命令不准确