如何检测 CDRom 是否是 Linux 上的 DVD



我希望在Linux上运行C++创建一个函数,如果CDRom介质是DVD,则返回true,如果其他任何介质(例如音频CD(,则返回false。

我一直在linux/cdrom.h一起使用ioctl.我尝试使用DVD_READ_STRUCT但它总是返回 true。也许我用错了。

dvd_struct s
if (ioctl(hDEV, DVD_READ_STRUCT, &s)) {
    return true;
}

看看/proc/sys/dev/cdrom/info,它包含这样的东西:

CD-ROM information, Id: cdrom.c 3.20 2003/12/17
drive name:         sr0
drive speed:        125
drive # of slots:   1
Can close tray:     1
Can open tray:      1
Can lock tray:      1
Can change speed:   1
Can select disk:    0
Can read multisession:  1
Can read MCN:       1
Reports media changed:  1
Can play audio:     1
Can write CD-R:     1
Can write CD-RW:    1
Can read DVD:       1
Can write DVD-R:    1
Can write DVD-RAM:  1
Can read MRW:       0
Can write MRW:      0
Can write RAM:      1

(它由内核更新,可在所有发行版中使用(除了来自cdrom.hioctl之外,您还可以使用此信息。还要记住,cdrom.h是创建标准接口的尝试,它尚未满足所有制造商的需求,有些制造商仍在使用 SCSI 代码或其他一些专有方案。因此,为了安全起见,您还应该至少使用 SCSI ioctl代码进行检查 - #include <scsi/...让它们可用。

官方文档更有帮助。 在调用 ioctl 之前,您必须指定请求类型和任何必需的输入。

// Is it a DVD?
dvd_struct ds;
ds.type = DVD_STRUCT_PHYSICAL;
ds.physical.layer_num=0;
result = ioctl(drive, DVD_READ_STRUCT, &ds);
if (result == -1) {
    perror("Probably not a DVD: ");
} else {
    printf("Layer 0: %i to %i.n", ds.physical.layer[0].start_sector, ds.physical.layer[0].end_sector);
}

真正有趣的东西需要发出SCSI命令,如dvd + rw-tools,cdrkit和cdrdao。 但是,这样做有点痛苦,如果您不需要知道光盘是可刻录、可重写还是可压制的,则没有必要。

相关内容

  • 没有找到相关文章

最新更新