4.12 文件长度

s t a t结构的成员s t _ s i z e包含了以字节为单位的该文件的长度。此字段只对普通文件、目录文件和符号连接有意义。你知道吗,SVR4对管道也定义了文件长度,它表示可从该管道中读到的字节数,我们将在14.2中讨论管道。对于普通文件,其文件长度可以是0,在读这种文件时,将得到文件结束指示。对于目录,文件长度通常是一个数,例如16或512的整倍数,我们将在4.21节中说明读目录操作。对于符号连接,文件长度是在文件名中的实际字节数。lrwx 1 root 7 Sep 25 07:14 lib -> usr/lib文件长度7就是路径名usr/lib的长度(注意,因为符号连接文件长度总是由s t _ s i z e指示,所以符号连接并不包含通常C语言用作名字结尾的null字符)。SVR4和4.3+BSD也提供字段s t _ b l k s i z es t _ b l o c k s。第一个是对文件I/O较好的块长度,第二个是所分配的实际512字节块块数。回忆一下3.9节,其中提到了当我们将s t _ b l k s i z e用于读操作时,读一个文件所需的最少时间量。为了效率的缘故,标准I/O库(我们将在第5章中说明)也试图一次读、写s t _ b l k s i z e字节。要知道,不同的UNIX版本其s t - b l o c k s所用的单位可能不是512字节块。使用此值并不是可移植的。

文件中的空洞

3.6节中,我们提及普通文件可以包含空洞。在程序3-2中例示了这一点。空洞是由超过文件结尾端的位移量设置,并写了某些数据后造成的。作为一个例子,考虑下列情况:


$ ls -1 core 

-rw-r-- 1 stevens 8483248 Nov 18 12:18 core 

$ du -s core 

272 core

文件core的长度超过8 M字节,而du命令则报告该文件所使用的磁盘空间总量是272个512字节块(139 264字节)。在很多伯克利类的系统上,du命令报告1024字节块块数,SVR4则报告512字节块。