出于娱乐和实践的目的,我试图创建一个程序,以将位模式写入硬盘的特定扇区。我的想法是能够提供特定的扇区号(LBA格式),并让程序尝试对其进行写入,然后从中读取并确定写入和读取的内容是否相同。
到目前为止,该程序有效。但是,在处理非常大的驱动器(因此偏移量很大)时,我会遇到问题。
例如,从头开始搜索到LBA 1306638144(即,搜索到1306638144 * 512)会溢出搜索的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()是执行此操作的错误函数吗?有没有更好的方法来寻找特定行业?
最诚挚的问候!
答案 0 :(得分:0)
lseek
仅接受off_t
偏移值,在大多数体系结构上,它们是32位有符号长值。即使您准备了long long
偏移量,也会在使用前将其转换为32位值。
但是Posix现在带有lseek64
。除了使用off64_t
类型的偏移量(保证具有至少64位)外,它与相同的接口几乎具有相同的功能。
因此,如果您必须处理偏移量可能大于用(符号表示的)的文件(或设备),则只需使用启用的新64位lseek64
而不是旧版lseek
)的32位值。