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 e
和s 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字节块。
暂无评论