【发布时间】:2020-12-13 00:40:36
【问题描述】:
我正在尝试在 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, 0, 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 的倍数,我会得到该扇区无论如何都已损坏,如果它不是。我写的真的有用吗?不然怎么做这个检查?
【问题讨论】:
-
总是检查malloc是否不返回NULL
-
每个循环的 malloc/free 没有意义。只需 malloc 一次,在循环之前。
lseek返回off_t,而不是int,read返回ssize_t,而不是int。 do not cast result of malloc 和(int)size_block演员也很奇怪 - 删除它。而且我不认为我遵循read+lseek操作-read自己寻找光标,所以通过调用lseek,您一次移动到2*size_block。 -
将
bytes_read设置为 1 只是为了让 while 循环第一次运行……是违反直觉的。只需使用do {} while循环而不是while{} -
@Hawk 我忘了,谢谢。
-
@KamilCuk 你确定读指针的行为吗?有参考吗?
标签: c system-calls hard-drive sector