随机搜索CD-ROM驱动器

时间:2015-09-30 23:48:29

标签: c freebsd dvd cd-rom

这适用于Linux,但在FreeBSD上没有(我想要的):

我想练习我的CD-ROM驱动器,以防止镜头上的灰尘。在Linux上我运行(以root身份)我编写的C程序来回寻找,每次读取单个块。在FreeBSD上,这个程序并没有走得太远。我可以打开设备并寻找(比方说)块1.但是当我尝试读取块时,我得到错误22(EINVAL)。在第1次读取时,无论设备是否已安装(-t cd9660),它都会失败。我该怎么办?

完整计划为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;
  }

1 个答案:

答案 0 :(得分:3)

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

寻求4096并读取4096字节。

寻求2048并读取2048字节。

寻求到2048并读取1024个字节会在read()上给出EINVAL。

寻求1024并读取2048字节会在read()上给出EINVAL。