Если вам нужно все в одном процессе, вам придется использовать libudev для получения событий из udevd
или напрямую из ядра.
Видя, что использование libudev может быть проблемой вваше приложение (отсутствие документации?), альтернативой является использование программы udevadm , которая может:
- сообщать о событиях устройства после обработки
udevd
(udevadm monitor --udev --property
), - сообщает о событиях devive непосредственно из ядра (
udevadm monitor --kernel --property
) и - создает базу данных текущих устройств udevd (но не базы данных ядра!) (
udevadm info --query all --export-db
)
udevadm
является частью пакета udev, но не должен нуждаться в udevd
, если вы используете его только для сообщения о событиях ядра.Вы можете использовать его, если ваш процесс порождает его и анализирует его стандартный вывод (но вам нужно будет запустить его с помощью stdbuf -o L
).
В любом случае, возможно,быть много работы.Я уже реализовал многое из этого на своем NCD языке программирования , включая мониторинг USB-устройств.Возможно, вы захотите взглянуть на НИЗ;это полезно для многих задач настройки и хорошо справляется с горячим подключением.Например, эта программа NCD будет печатать события устройства USB на стандартный вывод:
process main {
sys.watch_usb() watcher;
println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
watcher->nextevent();
}
Это приведет к тому, что NCD напечатает что-то подобное (с начальным событием added
для любого USB-устройства, которое уже подключено):
added /dev/bus/usb/002/045 0409:0059
added /dev/bus/usb/002/046 046d:c313
added /dev/bus/usb/002/047 046d:c03e
added /dev/bus/usb/002/048 0557:2008
removed /dev/bus/usb/002/048 0557:2008
Вы также можете использовать NCD только для этого и проанализировать этот стандартный вывод - с ним гораздо проще работать, чем напрямую связываться с udevadm.
Обратите внимание, что NCD сам по себе использует udevadm
, а требует для запуска udevd;но почему это проблема в любом случае?(при некоторой работе эта зависимость может быть удалена)