这适用于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;
}
答案 0 :(得分:3)
事实证明我犯了两个错误:尝试一次读取一个字节,然后lseek()转到字节1.设备上的fstat()显示st_blksize为4096.
寻求4096并读取4096字节。
寻求2048并读取2048字节。
寻求到2048并读取1024个字节会在read()上给出EINVAL。
寻求1024并读取2048字节会在read()上给出EINVAL。