2.Linux C应用开发 ---- 空洞文件

空洞文件概念:

举个栗子:假如有个1k(1024字节)大小的文件,使用lseek函数使文件写入位置从2000字节处开始写数据,那么1024-2000之间就没有数据,形成空洞,这就是空洞文件。

空洞文件特点:

空洞文件空洞部分不会占用物理空间,除非写入数据。

空洞文件的文件实际大小包含了空洞部分。

 

读取空洞部分的数据,会读到什么数据呢?

这是一个关于空洞文件的例程:包含空洞文件创建、读取空洞部分数据、读取写入部分数据。

//open函数头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//close()函数头文件
#include <unistd.h>

//perro()函数
#include <stdio.h>

//erro错误编号头文件
#include <errno.h>

//exit()函数头文件
#include <stdlib.h>

#include <string.h>

int main(void)
{
    int fd;
    int ret;
    char buffer[1024];
    int i;

    //打开文件
    fd = open("./empty_file", O_RDWR);
    if(fd == -1)
    {
        perror("open erro");
        exit(-1);
    }

    //将文件读写位置移动到文件第2000个字节处
    ret = lseek(fd, 2000, SEEK_SET);
    if(ret == -1)
    {
        perror("lseek erro");
        goto err;
    }

    //初始化buffer
    memset(buffer, 'A', sizeof(buffer));

    //循环写入数据
    for(i = 0; i < 4; i++)
    {
        ret = write(fd, buffer,sizeof(buffer));
        if(ret == -1)
        {
            perror("write erro");
            goto err;
        }
    }

    //读取空洞部分文件数据
    memset(buffer, 0, sizeof(buffer));
    ret = read(fd, buffer,20);
    if(ret == -1)
    {
        perror("read erro");
        goto err;
    }
    printf("empty:%s\n",buffer);

    //清空数据
    memset(buffer, 0, sizeof(buffer));

    //读取文件写入字节处数据
    ret = lseek(fd, 4096, SEEK_SET);
    ret = read(fd, buffer,20);
        if(ret == -1)
    {
        perror("read erro");
        goto err;
    }
    printf("empty:%s\n",buffer);
    
err:
    close(fd);
    exit(ret);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值