Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中搜索设备的坏扇区_C_System Calls_Hard Drive_Sector - Fatal编程技术网

在C语言中搜索设备的坏扇区

在C语言中搜索设备的坏扇区,c,system-calls,hard-drive,sector,C,System Calls,Hard Drive,Sector,我正在尝试用c语言创建一个简单的脚本,它能够识别(设备)的坏扇区,用于教育目的。在我的示例中,我使用的是只读模式的HD。背后的想法很简单,但可能太简单了,我会知道这是否正确,并最终了解实现我目标的任何其他方式 让我们看看我的代码: #include<stdio.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> int mai

我正在尝试用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;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char**argcv){
大小\u t大小\u块=512;
int fd=open(“/dev/disk2”,仅限ordu);
ssize_t bytes_read=1;
char*buff=malloc(大小块*sizeof(char));
如果(buff==NULL){
退出(退出失败);
}
而(字节读取>0){
字节\读取=读取(fd、buff、大小\块);
int位置=lseek(fd,0,SEEK_CUR);
如果(字节数_读取==-1){
佩罗(“主要”);
}
//printf(“%s”,buff);//打印我阅读的内容
if(字节读取<大小块){
printf(“位于%p地址的块可能已损坏”、&位置);
}
}
免费(buff);
关闭(fd);
返回0;
}
因此,我尝试通过每次查找512字节的文件指针,使用read syscalls读取HD的扇区。这是第一个问题:既然首选的I/O块大小是2048字节(使用sys/stat.h的stat检索信息),那么每次查找512字节而不是2048字节是否正确?
此外,为了检查扇区是否坏,我使用比较
(bytes\u read
,因为我假设如果我无法读取扇区的字节总数,它可能会损坏。但是如果我到达“文件”的末尾,并且它不是512的倍数,使用这种方法,我将得到扇区无论如何也会被损坏,如果它不是的话。我写的东西真的有用吗?否则,如何进行此检查?

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

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


然而,我认为一个不好的行业不太可能导致看起来很短的阅读。我认为read()很可能会失败并返回-1,或者看起来成功并返回一些废话。我怀疑您需要进行写入和读取以检查坏扇区。

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

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


然而,我认为一个不好的行业不太可能导致看起来很短的阅读。我认为read()很可能会失败并返回-1,或者看起来成功并返回一些废话。我怀疑您需要写和读来检查坏扇区。

始终检查malloc是否不返回null malloc/free-each循环中没有点。就一次,在循环之前
lseek
返回
off\u t
,而不是
int
read
返回
ssize\u t
,而不是
int
。而且
(int)size_block
的类型也很奇怪-删除它。我不认为我遵循了
read+lseek
操作-
read
会自动查找光标,因此通过调用
lseek
可以一次移动
2*size\u block
。将
bytes\u read
设置为1,以便while循环第一次运行。。。这是违反直觉的。只要使用
do{}while
循环,而不是
while{}
@Hawk我忘了,谢谢。@KamilCuk你确定读取指针的行为吗?任何引用?始终检查malloc是否不返回null在malloc/free每个循环中没有点。就一次,在循环之前
lseek
返回
off\u t
,而不是
int
read
返回
ssize\u t
,而不是
int
。而且
(int)size_block
的类型也很奇怪-删除它。我不认为我遵循了
read+lseek
操作-
read
会自动查找光标,因此通过调用
lseek
可以一次移动
2*size\u block
。将
bytes\u read
设置为1,以便while循环第一次运行。。。这是违反直觉的。只要使用
do{}while
循环,而不是
while{}
@Hawk我忘了,谢谢。@KamilCuk你确定读取指针的行为吗?有参考资料吗?“我怀疑你需要写和读来检查坏扇区”,但在扇区上写可能会替换我的真实数据,像badblocks这样的软件不会这样做。(在文章末尾读到:默认情况下,badblocks命令将执行只读测试。)。还可以看看这个程序:第一个功能是:“只读扫描坏块”。所以我认为这是可能的。如果你知道一个实用程序可以做你想做的,为什么不联系作者呢?然而,我怀疑只读测试只会显示坏块,如果它们已经被驱动器固件或文件系统标记为坏块。此类标记通常发生在彻底测试期间,但