在C中搜索设备的坏扇区

问题描述

我正在尝试用c创建一个简单的脚本,该脚本能够识别出于教育目的的(设备)的坏扇区。在我的示例中,我使用具有只读模式的HD。背后的想法很简单,但也许太简单了,我会知道这是否正确,并最终以其他任何方式达到我的目标。

让我们看一下我的代码

#include<stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char ** argcv){
        size_t size_block = 512;
        int fd = open("/dev/disk2",O_RDONLY);
        ssize_t bytes_read = 1;
        char *buff = malloc(size_block * sizeof(char));

        if (buff == NULL){
           exit(EXIT_FAILURE);
        }

        while (bytes_read > 0){
                bytes_read = read(fd,buff,size_block);
                int position = lseek(fd,SEEK_CUR);
                if (bytes_read == -1){
                        perror("main");
                }
                //printf("%s",buff); //prints the content of what I read
                if (bytes_read < size_block){
                        printf("the block at %p address is probably damaged",&position);
                }
        }
        free(buff);
        close(fd);
        return 0;
}

因此,我尝试通过每次尝试查找512字节的文件指针来读取具有读取的系统调用的HD扇区。这是第一个问题:由于首选的I / O块大小为2048字节(使用sys / stat.h的stat检索到的信息),因此每次512字节而不是2048字节都正确查找吗? 另外,由于我假设如果我无法读取扇区的全部字节,则可能会损坏扇区,因此要比较扇区(bytes_read < size_block),以检查扇区是否损坏。但是,如果我到达“文件”的末尾,并且此方法不是512的倍数,则即使扇区未损坏,也将损坏该扇区。我写的东西真的有用吗?否则,我该怎么做?

解决方法

至少,在Linux上,我相当确定,无论底层设备的容量如何,块设备将始终具有512字节倍数的可读大小。如果没有足够的物理数据来填充512字节,则内核会填充最后一块。在设备上创建文件系统时,文件系统工具会舍入分配的大小以解决此问题。

这意味着大小为512的read()将始终返回512或错误,即使它是最后一次读取且未填充整个512字节缓冲区。

但是,我认为坏的部门不太可能引起看似简短的阅读。我认为read()更可能会失败并返回-1,或者看起来似乎成功并返回一些废话。我怀疑您需要读写才能检查坏扇区。