【问题标题】:lseek()'s offset and large block deviceslseek() 的偏移量和大块设备
【发布时间】: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() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的行业?

最好的问候!

【问题讨论】:

    标签: c linux lseek


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢!这正是我想要的!对于那些感兴趣的人,我在这里发布了代码:pastebin.com/NHzaY1jC
    猜你喜欢
    • 1970-01-01
    • 2019-04-14
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多