Я делаю приложение, которое требует знания о том, открыт или закрыт CD-дисковод.
eject
открывает дисковод компакт-дисков и проверяет, сколько времени требуется для его открытия (более короткое время говорит, что оно открыто, а более длинное, хорошо …), но я не могу использовать эту технику, потому что приложение фактически открывает дисковод (и я не хочу повторно открывать диск, если он закрыт, и я не хочу закрывать диск, если он открыт).
Как бы я сделал это на Linux? Я видел, что это возможно сделать под Windows (хотя может и ошибаться), но я не видел способа сделать это в Linux.
Если это невозможно с помощью вызовов API Linux, возможно ли реализовать функцию низкого уровня, которая могла бы сделать это?
Чтобы заставить пример кода работать, вы должны сделать это следующим образом:
#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.
Вы можете получить состояние лотка с помощью 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 */
}