分类: 系统运维
2012-03-28 13:34:08
stat结构体的st_size成员包含文件以字节为单位的尺寸。这个域只有普通文件、目录和符号链接有意义。
Solaris同样定义了管道的尺寸,表示管道可读的字节数。我们将在15.2节讨论管道。
对于一个普通文件,文件尺寸为0是允许的。我们将在第一次读取文件时得到一个文件结束标记。
对于一个目录,文件尺寸通常是一个数的倍数,比如16或512.我们在4.21讨论读目录。
对于符号链接,文件尺寸是文件名的字节数。比如,下面的情况下,文件尺寸为7,表示路径名/usr/lib的长度:
lrwxrwxrwx 1 tommy tommy 7 2012-02-22 13:54 lib -> usr/lib
(注意符号链接没有包含在名字末尾的通常C终止符,长度一直由st_size指定。)
多数当代UNIX系统提供了域st_blksize和st_blocks。前者是文件I/O最喜欢的块尺寸,而后者是所分配的512字节块的真实数量。回
想下3.9节当我们使用st_blksize进行读操作时,我们碰到了读取文件所需的最小时间量。我们将在第5章讲述的标准I/O库,,同样为了效率一次
读或写st_blksize字节。
注意UNIX不同的版本为st_blocks使用不是512字节块的其它值。使用这个值是不可移植的。
文件里的空洞
在3.6节,我们提到一个普通文件可以包含“空洞”。我们也展示了一个例子。空洞可以通过seek超过当前文件结束位置然后写一些数据来创建。举个例子,考虑下面:
$ ls -l file.hole
-rw-r--r-- 1 tommy tommy 8483258 2012-02-22 14:05 file.hole
$ du -s file.hole
8 file.hole
文件fle.hole的尺寸刚超过了8M,然而du命令显示文件使用的磁盘空间是8个1024字节块。(基于BSD的系统报告一个1024字节块的数量,Solaris报告512字节块的数据。)显然,这个文件有许多空洞。
正如我们在3.6节提到的那样,read函数为任何没有写过的字节部分返回字节0。如果我们执行下面的命令,我们能看到普通I/O操作通过文件尺寸来获得信息:
$ wc -c file.hole
8483258 file.hole
使用-c选项的wc命令返回文件的字符(字节)数。
如果我们使用一个比如cat的工具来复制这个文件,所有的这些空洞都会被真实的数据字节0写入:
$ cat file.hole > file.hole.copy
$ ls -l file.hole file.hole.copy
-rw-r--r-- 1 tommy tommy 8483258 2012-02-22 14:05 file.hole
-rw-r----- 1 tommy tommy 8483258 2012-02-22 14:14 file.hole.copy
$ du -s file.hole*
8 file.hole
8288 file.hole.copy
这里,新文件真正使用的字节数为8486912(8288 x 1024)。这个值和ls报告的值不同,因为文件系统使用一些块来保存指向真实数据块的指针。