我已经完成了以下代码来测试ioctl的使用,我对结果感到非常困惑。
int main(void)
{
int id;
dvd_struct s;
id=open("/dev/dvd",O_RDONLY);
ioctl(id,DVD_READ_STRUCT,&s);
printf("%d,%s,%s",s.bca.len,s.manufact.value,s.disckey.value);
close(id);
}
首先在制造商和disckey值中出现稀有符号,但这并不重要,如果它不是因为我运行程序的任何时候出现一个新值,尽管总是保持dvd在DVD播放器中。甚至bca.len在每次执行中也会有所不同,尽管它总是给出一个高于32000且低于33000的数字。
最后会给出结果是否有插入的DVD,所以我想知道它是从哪里得到的,即使它正在读取DVD。
操作系统正在识别DVD,因为cat / dev / dvd以良好的方式显示它的内容。
有人可以解释为什么它会以这种方式工作,如果我可以适当地使它工作(我的意思是,至少对于制造商和disckey值获得相同的结果并确保信息来自插入的DVD?
感谢您的关注。
答案 0 :(得分:1)
检查ioctl
的返回值。如果失败,s
将不会填充信息。
if (ioctl(id, DVD_READ_STRUCT, &s) < 0)
{
perror("DVD_READ_STRUCT");
return -1;
}
RETURN VALUE
Usually, on success zero is returned. A few ioctl() requests use the
return value as an output parameter and return a nonnegative value on
success. On error, -1 is returned, and errno is set appropriately.
ERRORS
EBADF fd is not a valid descriptor.
EFAULT argp references an inaccessible memory area.
EINVAL request or argp is not valid.
ENOTTY fd is not associated with a character special device.
ENOTTY The specified request does not apply to the kind of object
that the descriptor fd references.
BTW总是检查非空函数的返回值。
答案 1 :(得分:1)
谢谢,对于你的提示,我必须通过类似于在ioctl调用之前插入的代码来解决它:
memset(&s, 0, sizeof(s));
s.type = DVD_STRUCT_MANUFACT;
您必须为s设置一个类型,您将获得与该类型相关的类型,并为每个otrher类型执行相同的操作。