【问题标题】:How to check if CD drive is open or closed in linux?如何在Linux中检查CD驱动器是打开还是关闭?
【发布时间】:2013-03-27 05:35:09
【问题描述】:

我正在制作一个需要知道 CD 驱动器是打开还是关闭的应用程序。

eject 打开 CD 驱动器,检查需要多长时间才能打开(较短的时间表示已打开,较长的时间,嗯...),但我不能使用此技术,因为应用程序实际上打开驱动器(如果驱动器关闭,我不想重新打开驱动器,如果驱动器打开,我也不想关闭驱动器)。

我将如何在 linux 上执行此操作?我看到可以在 Windows 下执行此操作(虽然可能是错误的),但我还没有看到在 linux 上执行此操作的方法。

如果无法使用 linux API 调用,是否可以实现一个可以做到这一点的低级函数?

【问题讨论】:

  • 我不确定这是否可行。我不相信IDE接口会暴露驱动器托盘的状态,但SATA可能会。另外,没有任何打开或关闭概念的插槽和球童驱动器呢?
  • @Dai,我想知道 linux 是如何检测 CD 何时放入驱动器的......如果我知道的话,也许这可以回答我的问题。
  • 当介质发生变化时,驱动器会通知系统,但这与托盘的状态不同。
  • @Dai,哦...非常令人失望:/哦,好吧,我想我的问题已经解决了:(
  • 必须有 ioctl() 控制打开/关闭行为,请检查 cd-drive 的驱动程序,以确定是否存在此类 ioctl,ps:我认为,这个问题更适合对于unix and linux

标签: c++ c linux cd-drive


【解决方案1】:

要使示例代码正常工作,您应该这样做:

#include <sys/ioctl.h>
#include <linux/cdrom.h>

int result=ioctl(fd, CDROM_DRIVE_STATUS, CDSL_NONE);

switch(result) {
  case CDS_NO_INFO: ... break;
  case CDS_NO_DISC: ... break;
  case CDS_TRAY_OPEN: ... break;
  case CDS_DRIVE_NOT_READY: ... break;
  case CDS_DISC_OK: ... break;
  default: /* error */
}

即结果作为 ioctl() 函数结果返回,而不是作为槽参数返回。

【讨论】:

  • 有理由使用 CDSL_NONE 吗?文档说“要测试的插槽号,除了点唱机外,始终为零。”
  • 调用这个ioctl会导致托盘被加载;有没有办法防止这种情况发生?
  • @Jason 在非阻塞模式下打开设备 (O_NONBLOCK)。见this comment in linux/cdrom.h
【解决方案2】:

您可以使用CDROM_DRIVE_STATUS ioctl 获取托盘状态。所有用于 CD 驱动器的 ioctl 都可以在 /usr/include/linux/cdrom.h

中找到
#define CDROM_DRIVE_STATUS      0x5326  /* Get tray position, etc. */

取自here

int slot;
ioctl(fd, CDROM_DRIVE_STATUS, slot);

switch(slot) {
  case CDS_NO_INFO: ... break;
  case CDS_NO_DISC: ... break;
  case CDS_TRAY_OPEN: ... break;
  case CDS_DRIVE_NOT_READY: ... break;
  case CDS_DISC_OK: ... break;
  default: /* error */
}

【讨论】:

  • 有趣:CDS_TRAY_OPEN,这就是我们的答案。
  • 谢谢!将对此进行测试:D
  • 不起作用:/这是我的源代码:pastebin.com/y48ZYZ8x。它只是返回 false,不管它是否打开
  • @fredrik,谢谢,我找到了问题所在。我使用“切换”slot,而不是ioctl的返回值
  • @fredrik,是的,没有任何指针或默认值的“int slot”似乎也不好......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2011-10-20
  • 2013-03-11
相关资源
最近更新 更多