Есть ли команда, которая определяет, открыт ли лоток для компакт-диска?

Есть ли команда, которую вы можете запустить в сценарии оболочки, которая будет определять, открыт ли лоток для компакт-дисков или возвращать 1 или 0, в зависимости от того, было ли это (или что-то легко интерпретировать)?

В настоящее время я выполняю команду открытия и определяю время, необходимое для выполнения. Если это почти мгновенно, это открыто. Если это занимает время, оно было открыто и теперь закрыто.

Мне бы хотелось, чтобы метод не включал изменение текущего состояния - просто его обнаружение.

6
задан 7 April 2018 в 07:45

2 ответа

Я нашел миленькое решение здесь. Код C ниже, минимально измененный от связанного сайта, возвратит код выхода 0 если лоток открыт и 1 если это не.

Так, сохраните этот код как что-то (например. foo.c) и скомпилируйте его с этой командой:

gcc -o trayopen foo.c

Затем скопируйте скомпилированный исполняемый файл, trayopen кому: /usr/bin:

sudo cp trayopen /usr/bin

Вы должны не смочь сделать вещи как

trayopen /dev/sr0 && echo closed

Или, больше завершенное:

#!/bin/sh
if trayopen /dev/sr0
then
    echo "Tray is open."
else
    echo "Tray is closed."
fi

Код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/cdrom.h>

int main(int argc,char **argv) {
  int cdrom;
  int status=1;

  if (! argv[1] ){
    printf("Usage : trayopen [device]\n");
    printf("Result: Returns a 0 if the tray was open and 1 if it was closed\n");
    exit(2);
  }

  if ((cdrom = open(argv[1],O_RDONLY | O_NONBLOCK)) < 0) {
    printf("Unable to open device %s. Provide a device name (/dev/sr0, /dev/cdrom) as a parameter.\n",argv[1]);
    exit(2);
  }
  /* Check CD tray status */
  if (ioctl(cdrom,CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
    status=0;
  }

  close(cdrom);
  exit(status);
}
10
ответ дан 7 April 2018 в 07:45

На основе кода C @terdon я записал версию в Python:

#!/usr/bin/python
import os, fcntl, CDROM, sys

def drive_status(drive):
  fd = os.open(drive, os.O_RDONLY | os.O_NONBLOCK)
  rv = fcntl.ioctl(fd, CDROM.CDROM_DRIVE_STATUS)
  os.close(fd)
  return rv

sys.exit(drive_status(sys.argv[1]) != CDROM.CDS_TRAY_OPEN)

Очевидно, это могло использовать некоторую любовь к комментариям и cmdline обработке аргумента, но если Вам будет нужна версия Python, то... это будет работать.

Также обратите внимание что CDROM модуль может быть определенным для Linux, и что не вся поддержка дисков, запрашивающая (например, ioctl () возвратится CDS_NO_INFO).

Существуют другие CDROM.CDS_* константы, которые обеспечивают полезные варианты. В частности, CDS_DISK_OK скажет Вам, если лоток будет закрыт и будет иметь существующий диск.

4
ответ дан 23 November 2019 в 07:22

Другие вопросы по тегам:

Похожие вопросы: