【发布时间】:2020-11-10 12:57:52
【问题描述】:
为了好玩和练习,我尝试创建一个程序,将位模式写入硬盘驱动器的特定扇区。我的想法是能够提供特定的扇区号(LBA 格式)并让程序尝试写入它然后从中读取并确定写入和读取是否相同。
到目前为止,该程序有效。但是,在处理非常大的驱动器(因此偏移量非常大)时,我遇到了问题。
例如,从头寻找到 LBA 1306638144(即寻找到 1306638144*512)会溢出 seek 的 off_t。
//approximately what I am trying to achieve
#define SECTOR_SIZE 512
char buf[SECTOR_SIZE] = {0}; //would be initialised with a specific pattern
long long offset = 1306638144*SECTOR_SIZE
int fd = open("/dev/sdb", O_RDWR);
lseek(fd, offset, SEEK_SET); //offset overflows
write(fd, buf, sizeof(buf)/sizeof(char));
我尝试通过从 SEEK_CUR 迭代增加并避免传递大量数字来解决此问题。
有没有合适的方法来处理这个问题? lseek() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的行业?
最好的问候!
【问题讨论】: