在 CD-ROM 驱动器上随机搜索

Random seek on CD-ROM drive

这适用于 Linux,但不适用于 FreeBSD:

我想用我的光驱,把镜头弄脏。在 Linux 我 运行 (作为 root)我写的一个 C 程序来回寻找,每次读取一个块。在 FreeBSD 上,这个程序不会走得太远。我可以打开设备并寻找(比方说)块 1。但是当我尝试读取块时,出现错误 22 (EINVAL)。无论设备是否已安装 (-t cd9660),它在块 1 处的第一次读取都会失败。我该如何进行?

完整的节目是here。相关片段:

  lo_fd=Open(ar_argv[1],
             O_RDONLY,
             0
            );

  lo_high_bit=1;

  while(lo_high_bit>0)
  {
    if(lseek(lo_fd,
             lo_high_bit,
             SEEK_SET
            )
       ==
       (off_t)-1
      )
    {
      lo_high_bit>>=1;

      break;
    }

    if(read(lo_fd,
            lo_buffer,
            1
           )
       !=
       1
      )
    {
      lo_high_bit>>=1;

      break;
    }

    lo_high_bit<<=1;
  }

事实证明我犯了两个错误:尝试一次读取一个字节,然后 lseek() 到字节 1。设备上的 fstat() 显示 st_blksize of 4096。

寻找到 4096 并读取 4096 字节有效。

寻找到 2048 并读取 2048 字节有效。

查找 2048 并读取 1024 字节在 read() 上给出 EINVAL。

查找 1024 并读取 2048 字节在 read() 上给出 EINVAL。