LoveUnix » 编程开发 & Rational » 为什么剩下2G空间的磁盘分区能创建1T的磁盘文件,而不占空间呢?
让LU留住您的每

一天 让LU博客留住您的每一天
2005-12-16 11:41 littlestar
为什么剩下2G空间的磁盘分区能创建1T的磁盘文件,而不占空间呢?

为什么剩下2G空间的磁盘分区能创建1T的磁盘文件,而不占空间呢?以后读写它会有什么问题?
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda9             2.0G  283M  1.5G  15% /
/dev/sda3             494M   19M  449M   4% /boot
none                 1005M     0 1005M   0% /dev/shm
/dev/sda6             2.0G   33M  1.8G   2% /tmp
/dev/sda8              22G  1.5G   19G   7% /usr
/dev/sda7             3.9G   79M  3.6G   3% /var
/dev/sda2              34G   26G  6.9G  79% /home
/dev/sdb1             134G   97G   30G  76% /data

为什么剩下2G空间的磁盘分区能创建1T的磁盘文件,而不占空间呢?

#gcc largefile.c
#./a.out
#ls -lta /tmp/foo
-rw-------    1 test     test      1099511627788 12月 16 11:44 /tmp/foo

cat largefile.c
#define _GNU_SOURCE

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd;
    int ret;
    char buf[] = "hello world\n";
    long long off;
    struct stat64 stat;

    fd = open("/tmp/foo", O_RDWR | O_CREAT | O_LARGEFILE, 0600);

    off = 0x10000000000LL;
    ret = lseek64(fd, off, SEEK_SET);
    if (ret < 0) {
        perror("lseek64(): ");
        return 1;
    }

    ret = write(fd, buf, sizeof(buf) - 1);
    if (ret < 0) {
        perror("write(): ");
        return 1;
    }

    ret = fstat64(fd, &stat);
    if (ret < 0) {
        perror("fstat64(): ");
        return 1;
    }
    printf("file size: %lld(%#llx) bytes\n", stat.st_size, stat.st_size);
   
    close(fd);

    return 0;
}

2005-12-16 16:01 jxppp
因为产生一个空洞文件。:$

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.