stat结构成员st_size表示以字节为单位的文件长度。此字段只对普通文件、目录文件和符号链接有意义。
对于普通文件,其文件长度可以是0,在读这种文件时,将得到文件结束(end-of-file)指示。
对于目录,文件长度通常是一个数(例如16或512)的倍数。
对于符号链接,文件长度是文件名中的实际字节数。例如:
lrwxrwxrwx 1 root root 8 01-02 05:56 lib -> /usr/lib
其中,文件长度8就是路径名/usr/lib的长度(注意,因为符号链接文件长度总是由st_size指示,所以它并不包含通常c语言用作名字结尾的null字符)。
现今,大多数UNIX系统提供字段st_blksize和st_blocks。其中,第一个是对文件I/O较合适的块长度,第二个是所分配的实际512字节块的数量。在文件I/O之I/O的效率篇中,提到了当我们将st_blksize用于读操作时,读一个文件所需的时间量最少。为了效率的缘故、标准I/O库也试图以此读、写st_blksize个字节。
应当了解到是,不同的UNIX版本其st_blocks所用的单位可能不是512字节的块。使用此值并不是可移植的。
文件中的空洞
空洞是由所设置的偏移量超过文件尾端,并写了某些数据后造成的。对于没有写过的字节位置,read函数读到的字节是0.
如果使用实用程序(例如cat(1))复制这种文件,那么所有这些空洞都会被填满,其中所有实际数据字节皆填写为0.