ioctl如何正确工作以及如何使其适用于DVD读数?

时间:2016-03-11 16:40:22

标签: c hardware ioctl

我已经完成了以下代码来测试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?

感谢您的关注。

2 个答案:

答案 0 :(得分:1)

检查ioctl的返回值。如果失败,s将不会填充信息。

if (ioctl(id, DVD_READ_STRUCT, &s) < 0) 
{
   perror("DVD_READ_STRUCT");
   return -1;
}

Man

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类型执行相同的操作。