在 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。
这适用于 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。