Chinaunix首页 | 论坛 | 博客
  • 博客访问: 968664
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-11-20 16:51:03

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

阅读(1482) | 评论(0) | 转发(0) |
0

上一篇:次贷危机的起因

下一篇:标清高清

给主人留下些什么吧!~~