2013-03-27 16 views
7

Sto facendo un'applicazione che richiede la conoscenza se un'unità CD è aperta o chiusa.Come verificare se l'unità CD è aperta o chiusa in linux?

eject apre l'unità CD e controlla il tempo necessario per l'apertura (un tempo più breve indica che è aperto e più lungo, beh ...), ma non posso usare questa tecnica, perché l'applicazione si apre effettivamente l'unità (e non voglio riaprire l'unità se è chiusa, né voglio chiudere l'unità se è aperta).

Come farei questo su linux? Ho visto che è possibile farlo in Windows (potrebbe essere sbagliato però), ma non ho visto un modo per farlo su Linux.

Se non è possibile utilizzare le chiamate API di Linux, è possibile implementare una funzione di basso livello che potrebbe fare ciò?

+0

Non sono sicuro che sia possibile. Non credo che l'interfaccia IDE esponga lo stato del cassetto unità, tuttavia SATA potrebbe. Inoltre, che dire delle unità slot e caddy che non hanno alcun concetto di apertura o chiusura? – Dai

+0

@Dai, mi chiedo allora come Linux possa rilevare quando un CD è stato inserito nell'unità, quindi ... se lo sapessi, forse potrebbe rispondere alla mia domanda. – MiJyn

+0

L'unità invia una notifica al sistema quando il supporto cambia, ma non è la stessa cosa dello stato del vassoio. – Dai

risposta

6

Per fare l'esempio di codice di lavoro, si dovrebbe fare in questo modo:

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

vale a dire il risultato viene restituito come risultato della funzione ioctl(), non nell'argomento dello slot.

+0

C'è un motivo per usare CDSL_NONE? Il documento dice "Numero di slot da testare, sempre zero tranne che per i jukebox". –

4

È possibile ottenere lo stato del vassoio utilizzando l'ioctl CDROM_DRIVE_STATUS. Tutti ioctls per i CD-drive può essere trovato in /usr/include/linux/cdrom.h

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

Tratto da 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

Interessante:' CDS_TRAY_OPEN', c'è la nostra risposta. – Dai

+0

Grazie! Testerà questo: D – MiJyn

+0

Non funziona:/Ecco il mio codice sorgente: http://pastebin.com/y48ZYZ8x. Restituisce semplicemente falso, indipendentemente se è aperto o meno – MiJyn

Problemi correlati