Как проверить, открыт ли CD-привод в Linux?

Я делаю приложение, которое требует знания о том, открыт или закрыт CD-дисковод.

eject открывает дисковод компакт-дисков и проверяет, сколько времени требуется для его открытия (более короткое время говорит, что оно открыто, а более длинное, хорошо …), но я не могу использовать эту технику, потому что приложение фактически открывает дисковод (и я не хочу повторно открывать диск, если он закрыт, и я не хочу закрывать диск, если он открыт).

Как бы я сделал это на Linux? Я видел, что это возможно сделать под Windows (хотя может и ошибаться), но я не видел способа сделать это в Linux.

Если это невозможно с помощью вызовов API Linux, возможно ли реализовать функцию низкого уровня, которая могла бы сделать это?

7

Решение

Чтобы заставить пример кода работать, вы должны сделать это следующим образом:

#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 (), а не в аргументе slot.

6

Другие решения

Вы можете получить состояние лотка с помощью CDROM_DRIVE_STATUS IOCTL. Все ioctl для CD-приводов можно найти в /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 */
}
4

По вопросам рекламы [email protected]