lseek()的偏移量和大块设备

时间:2020-07-21 07:29:42

标签: c linux lseek

出于娱乐和实践的目的,我试图创建一个程序,以将位模式写入硬盘的特定扇区。我的想法是能够提供特定的扇区号(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()是执行此操作的错误函数吗?有没有更好的方法来寻找特定行业?

最诚挚的问候!

1 个答案:

答案 0 :(得分:0)

lseek仅接受off_t偏移值,在大多数体系结构上,它们是32位有符号长值。即使您准备了long long偏移量,也会在使用前将其转换为32位值。

但是Posix现在带有lseek64。除了使用off64_t类型的偏移量(保证具有至少64位)外,它与相同的接口几乎具有相同的功能。

因此,如果您必须处理偏移量可能大于用(符号表示的)的文件(或设备),则只需使用启用的新64位lseek64而不是旧版lseek )的32位值。