8

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

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

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

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

4

2 回答 2

8

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

#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() 函数结果返回,而不是作为槽参数返回。

于 2013-10-04T10:59:14.230 回答
6

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

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

取自这里

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 */
}
于 2013-03-27T06:41:05.803 回答