关于块设备读写时的一些问题记录

最近在做关于ntfs文件系统的深度分析功能,要求是,一张源盘,一张裸盘,要求进行一次基础同步后,向源盘中添加文件,执行深度分析,对两张盘中不相同的数据进行同步。

最开始的想法是,在基础同步的基础上加一个函数判断,从两张盘的相同位置读取同样大小的数据,相同就跳过本次循环,不同就将源盘中的数据写入到裸盘中。

简单来说,分别调用open函数打开两个块设备。分别从两个块设备中读取数据,对比,相同就跳过,不同就写入。

fd_in = open(/dev/vdd1,O_RDWR);//源盘
fd_out = open(/dev/vdd1,O_RDWR);//裸盘

之后写一个对比函数,对比从块设备中读取的数据是否相同;

static int cmo_cluster_in_buff(u32 csize)
{
    char *buffer_in;
    char *buffer_out;

    void *fd_in = vol->dev;

    buffer_in = (char *)ntfs_malloc(csize);
    buffer_out = (char *)ntfs_malloc(csize);

    read_all(fd_in,buffer_in,csize);
    if(read(fd_out,buffer_out,csize) != 4096)
    {
        printf("read_put error\n");
    }
    
    if(memcmp(buffer_in,buffer_out,csize) == 0)
    {
        free(buffer_in);
        free(buffer_out);
        return 1;
    }
    else
    {
        lseek(fd_out,-csize,SEEK_CUR);
        write(fd_out,buffer_in,csize);
        free(buffer_in);
        free(buffer_out);
        return 0;
    }
}

重点就在于,lseek这个函数,你调用read()读取了csize(4096)个字节到buffer_In中,他的文件指针就指向了读取完这4096个字节之后的位置,之后在调用write()写入的一直是之后的位置,而不是开始读取时的位置。需要调用lseek去向前偏移4096个字节才算真正写入到应该写入的位置。

就这一个问题,困扰了我一周(当然任务也没多急,我能多划划水就多划划水,反正日报就写demo测试问题排查就好)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值