1. 文件是可以有空洞的,空洞不占用磁盘空间,但是我们用ls查看的文件大小是将空洞算在内的。
2. cp命令拷贝的文件,空洞部分不拷贝,所以生成的文件同样占用磁盘空间小
3. 用read读取空洞部分读出的数据是0,所以如果用read和write拷贝一个有空洞的文件,那么最终得到的文件没有了空洞,空洞部分都被0给填充了,文件占用的磁盘空间就大了。不过文件大小不变。
例子:
$ dd if=/dev/null of=aba bs=1024k seek=5
0+0 records in
0+0 records out
0 bytes transferred in 1 secs (0 bytes/sec)
$ ls -al aba
-rw-r--r-- 1 langue universe 5242880 Nov 8 05:50 aba
$ du aba
16 aba
$ cp aba bab
$ du aba bab
16 aba
5128 bab
$ uname -a
NetBSD 1.3 NetBSD 1.3 (GENERIC-O) #344: Thu Oct 29 02:26:40 CST 2006 langue@:usr/src/sys/arch/i386/compile/GENERIC-O i386
$ mount
/dev/wd0a on / type ffs (local)
/dev/wd0e on /usr type ffs (local)
kernfs on /kern type kernfs (local)
使用如下程序进行文件拷贝测试:
#include
#include
#include
#include
#include
#define BUFSIZE 4096
char buf[BUFSIZE] ;
int main(int argc ,char *argv[])
{
int f_src,f_dest;
ssize_t rcount,wcount;
if(argc!=3)
{
printf("usage:copy filename1 filename2\n");
return 0;
}
if(strcmp(argv[1],"-")==0)
f_src=STDIN_FILENO;
else
{
if((f_src=open(argv[1],O_RDONLY))<0)
{
printf("cant not open %s\n",argv[1]);
return 0;
}
}
if(strcmp(argv[2],"-")==0)
f_dest=STDOUT_FILENO;
else
{
umask(0);
if((f_dest=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP))<0)
{
printf("cant not open %s\n",argv[2]);
perror("open failed!!");
return 0;
}
umask(022);
}
while((rcount=read(f_src,buf,BUFSIZE))>0)
{
if((wcount=write(f_dest,buf,rcount))!=rcount)
{
perror("write error!!");
return 0;
}
}
if(rcount<0)
perror("read error");
return 0;
}
测试结果:
$ dd if=/dev/null of=tmpfile bs=1024k seek=1
0+0 records in
0+0 records out
0 bytes transferred in 1 secs (0 bytes/sec)
$ ./copy tmpfile tmpfile1
$ du tmp*
32 tmpfile
2064 tmpfile1
$ hexdump tmpfile
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0100000
$ hexdump tmpfile1
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0100000
$
从 tmpfile1 占用了 2064 个 512 字节大小的块可以看出,它的确占用了至少 1024KB,而 tmpfile 只有 16KB,根据 ls -al tmpfile* 的结果:
$ ls -al tmpfile*
-rw-rw-r-- 1 langue universe 1048576 Nov 8 13:05 tmpfile
-rw-rw---- 1 langue universe 1048576 Nov 8 13:05 tmpfile1
阅读(1505) | 评论(0) | 转发(0) |