如何在linux中检查CD驱动器是打开还是关闭?

MiJ*_*Jyn 7 c c++ linux cd-drive

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

eject 打开CD驱动器,并检查打开所需的时间(更短的时间说它打开,更长,好......),但我不能使用这种技术,因为应用程序实际打开驱动器(和我如果驱动器关闭,不想重新打开驱动器,如果驱动器打开,我也不想关闭它.

我怎么在linux上这样做?我看到可以在Windows下执行此操作(虽然可能是错误的),但我还没有看到在linux上执行此操作的方法.

如果使用linux API调用是不可能的,是否可以实现可以执行此操作的低级函数?

fre*_*rik 6

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

#define CDROM_DRIVE_STATUS      0x5326  /* Get tray position, etc. */
Run Code Online (Sandbox Code Playgroud)

取自这里

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 */
}
Run Code Online (Sandbox Code Playgroud)


小智 6

要使示例代码有效,您应该这样做:

#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 */
}
Run Code Online (Sandbox Code Playgroud)

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