2013-03-27 104 views
7

我正在制作一个需要知道CD驱动器是否打开或关闭的应用程序。如何检查CD驱动器在linux中是打开还是关闭?

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

我该如何做到这一点在linux上?我发现可以在Windows下执行此操作(虽然可能是错误的),但我还没有看到在Linux上执行此操作的方法。

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

+0

我不确定这是可能的。我不相信IDE接口暴露了驱动器托盘的状态,但SATA可能。另外,那些没有任何开放或关闭概念的插槽和球童驱动器呢? – Dai 2013-03-27 05:40:00

+0

@戴,我想知道当一张光盘放入驱动器时,linux如何检测到,然后......如果我知道,也许这可以回答我的问题。 – MiJyn 2013-03-27 05:43:21

+0

当介质发生变化时,驱动器会通知系统,但这与托盘的状态不同。 – Dai 2013-03-27 05:45:41

回答

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 */ 
} 

即结果将返回为ioctl()函数结果,而不是插入到槽参数中。

+0

是否有使用CDSL_NONE的理由?该文件称“要测试的插槽号码,除了自动唱片点唱机之外始终为零。” – 2016-01-07 16:46:27

4

您可以通过使用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 */ 
} 
+0

有趣的是:'CDS_TRAY_OPEN',这是我们的答案。 – Dai 2013-03-27 07:05:04

+0

谢谢!将测试这个:D – MiJyn 2013-03-27 17:45:07

+0

不起作用:/这是我的源代码:http://pastebin.com/y48ZYZ8x。它只是返回false,无论它是否打开 – MiJyn 2013-03-27 21:46:53

相关问题