Intereting Posts
Свойство командной строки CLI Linux 2.0 Как можно обрезать Wingpanel в элементарной ОС Freya и Dock? (In) значение и tty корневых процессов agrep с направленными смещенными штрафами Подключение двух клиентов Windows в отдельных подсетях через маршрутизатор Debian Совершенно новый для Linux – запуск сервера веб-сервера / базы данных, необходимо подключиться к моим серверам – как? Вложенная строка grep выводит строку с надписью «(стандартный ввод)» Как я могу перечислить все файлы, но только в каталогах, у которых нет подкаталогов? Калибровочное направление прокрутки Kali Linux Каков наилучший способ установки 3 жестких дисков с 3 ОС на один компьютер? Присоединиться: два файла – но только добавить последние два столбца Как определить статус моего сервера Как GRUB 2 работает под несколькими разделами Linux с UEFI Как установить переменные среды для программы, выполненной с помощью `nohup`? Восстановить окно GUI после минимизации в ratpoison

Как программно определить, когда устройство вызывает прерывание?

Как программно определить, когда устройство вызывает прерывание? Это может быть, когда устройство подключено или отключено.

А также этот случай: например: когда палец удерживается над сканером отпечатков пальцев, прерывание поднимается. Как обнаружить и, возможно, захватить это прерывание?

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

Если это невозможно сделать в Gtkmm, можно ли захватить прерывание на более низком уровне и сообщить приложение Gtkmm?

Я проверял, как ведет себя GParted. Первоначально он показывал /dev/sda и когда я подключил свой pendrive, он автоматически открыл приложение для files . Когда я проверил GParted, pendrive не присутствовал в выпадающем меню устройств. Он появился только тогда, когда я выбрал «Обновить устройства» в меню GParted или Ctrl + R.

Я могу попытаться уловить прерывание на более низком уровне и сообщить приложение gtkmm.

Нет, это активность ядра . К счастью, ядро ​​сообщает о результатах определенных событий через интерфейсы, доступные из userland.

В вашем вопросе немного неоднозначно, хотите ли вы определить, когда подключено блочное устройство или когда установлена ​​файловая система (хотя она, кажется, более первая). Если ваша система использует автоматизацию (обычно они работают по умолчанию), она будет монтировать файловые системы с блочных устройств, когда они подключены, в противном случае вы должны сделать это вручную (например, с помощью mount ).

В любом случае, вы хотите опросить / разобрать / сканировать интерфейс на основе файла ядра. Я сделал это раньше в приложении (на самом деле C ++ GTK), который отслеживает как подключенные блочные устройства, так и смонтированные файловые системы через /dev/ и /etc/mtab . Это простой, агностический метод языка. Некоторым людям сначала кажется немного неприятным, потому что это связано с чтением файлов / каталогов, но эти интерфейсы на самом деле не существуют на диске, поэтому нет тяжелых накладных расходов ввода-вывода и помните: read() – системный вызов. Чтение узлов файлов в интерфейсах ядра составляет то же, что и API стиля listAttachedDevices() , за исключением того, что он является агностиком языка. Когда вы переходите к чтению с этих узлов, ядро ​​передает вам информацию, которую они представляют напрямую.

В каталоге /dev перечислены вложенные устройства в качестве специальных файлов узлов устройства – например, /dev/sda . Они добавляются и удаляются ядром, поскольку устройства подключены и выходят, поэтому, если вы отслеживаете его путем опроса с интервалом (скажем, каждые 5 секунд), вы можете обнаружить, что нового и что ушло. Единственное усложнение здесь заключается в том, что, поскольку API-интерфейс обратного вызова не существует, вам нужно создать свой собственный поток для этого, если вам нужна непрерывная проверка (возможно, почему gparted требует, чтобы вы вместо этого gparted Refresh Devices ).

Вероятно, лучшей альтернативой /dev будет материал в /sys/block . Обратите внимание, что существует значительная разница между /dev и /proc (см. Ниже) или /sys поскольку узлы в последнем содержат информацию о таких вещах, как устройства, тогда как узлы в /dev являются фактическим подключением к устройству (поэтому, если вы сканируете /dev , не утруждайте себя чтением отдельных файлов, просто заметьте, что они существуют).

/etc/mtab now-a-days – символическая ссылка (см. также переключатель -s в man ln ) в /proc/self/mounts ; /proc является основным интерфейсом ядра швейцарского армейского ножа (см. man proc ). В нем перечислены смонтированные файловые системы ; если вы используете автоматизацию, вещи появятся и исчезнут оттуда, когда материал будет включен / выключен. Информация в /proc и /sys обычно представляет собой текст ASCII, поэтому вы можете просматривать эти файлы с помощью cat и т. Д. И анализировать его с помощью строковых (потоковых) функций.

WRT для других типов устройств, таких как сканер отпечатков пальцев, /sys – хорошее место для запуска – /sys/dev содержит block и каталог char . Блочные устройства обычно хранятся; информация о них может быть случайным образом доступна . Char устройства обмениваются информацией с системой в потоке, которая будет включать в себя такие вещи, как сканеры, камеры, HID-материалы (устройство для интерфейса человека, например мыши и клавиатуры). Я замечаю, что у gtkmm действительно есть материал высокого уровня для прикрепленных HID-вещей, по-видимому, поскольку они существенны при взаимодействии с GUI.

Я одобряю ответ на goldilocks . Но вместо использования системного вызова, read для проверки изменений файловой системы, можно использовать inotify .

Его справочная страница здесь и здесь .

Существует отличное объяснение и пример создателей (разработчиков) inotify здесь .