2013-03-27 130 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

相關問題