lseek() 的偏移量和大块设备
lseek()'s offset and large block devices
为了好玩和练习,我尝试创建一个程序,将位模式写入硬盘驱动器的特定扇区。我的想法是能够提供一个特定的扇区号(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() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的部门?
此致!
lseek
只接受 off_t
偏移值,并且在大多数体系结构上,它们是 32 位有符号长值。即使您准备了 long long
偏移量,它也会在使用前转换为 32 位值。
但是 Posix 现在带有 lseek64
。它几乎是具有相同接口的相同功能,只是它使用 off64_t
类型偏移量,保证具有(至少)64 位。
因此,如果您必须处理偏移量可能大于可以用(有符号)32 位值。
为了好玩和练习,我尝试创建一个程序,将位模式写入硬盘驱动器的特定扇区。我的想法是能够提供一个特定的扇区号(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() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的部门?
此致!
lseek
只接受 off_t
偏移值,并且在大多数体系结构上,它们是 32 位有符号长值。即使您准备了 long long
偏移量,它也会在使用前转换为 32 位值。
但是 Posix 现在带有 lseek64
。它几乎是具有相同接口的相同功能,只是它使用 off64_t
类型偏移量,保证具有(至少)64 位。
因此,如果您必须处理偏移量可能大于可以用(有符号)32 位值。