Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1745048
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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报告的值不同,因为文件系统使用一些块来保存指向真实数据块的指针。

阅读(1046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~