Я пытаюсь создать простой скрипт на 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;
}
Поэтому я пытаюсь читать сектора моего HD с помощью системных вызовов чтения, каждый раз ища указатель файла размером 512 байт. И это первый вопрос: так как предпочтительный размер блока ввода-вывода составляет 2048 байт (информация получена с помощью статистики sys/stat.h), правильно ли искать каждый раз 512 байт вместо 2048? Кроме того, чтобы проверить, является ли сектор плохим, я использую для сравнения (bytes_read < size_block)
, потому что я предполагаю, что если я не могу прочитать все байты сектора, он может быть поврежден. Но если я достигну конца файла, и он не кратен 512 с помощью этого метода, я получу, что сектор все равно поврежден, даже если это не так. То, что я написал, действительно работает? Иначе как я могу сделать эту проверку?
lseek
возвращаетoff_t
, а неint
, аread
возвращаетssize_t
, а неint
. И не приводить результат malloc и приведение(int)size_block
тоже странно - убери это. И я не думаю, что следую операцииread+lseek
-read
сама ищет курсор, поэтому, вызываяlseek
, вы перемещаетесь на2*size_block
за раз. - person KamilCuk   schedule 24.08.2020bytes_read
в 1 только для того, чтобы цикл while выполнялся в первый раз... нелогичен. Просто используйте циклdo {} while
вместоwhile{}
- person Hawk   schedule 24.08.2020The file offset shall be incremented by the number of bytes actually read.
- person KamilCuk   schedule 24.08.2020