问题描述
我正在尝试用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,或者看起来似乎成功并返回一些废话。我怀疑您需要读写才能检查坏扇区。