Můžete použít libudev
nebo analyzovat udevadm
výstup, jak navrhl @Ambroz Bizjak. Nedoporučuji však přidávat další proces (stdbuf
) a jazyk (NCD
), stačí analyzovat výstup udevadm.
Krok mezi prostým libudev a výstupem analýzy je úprava zdrojů udevadm. Toto řešení snižuje potřebné zdroje a zcela vynechává proces analýzy. Když se podíváte na balíček udev, najdete zdroje pro udevd a udevadm v udev
adresář.
Zde máte hlavní rutinu v udevadm.c
a zdroj pro udevadm monitor
v udevadm-monitor.c
. Každá přijatá událost bude vytištěna pomocí print_device()
. Zde vložíte svůj kód.
Pokud máte nedostatek paměti, můžete odstranit nepotřebný kód pro control
, info
, settle
, test-builtin
, test
a trigger
. V mém systému (Ubuntu 12.04) to snižuje velikost udevadm asi o 75 %.
Bohužel na straně gadgetu není vytvořena žádná událost udev na connect/disconnect, takže je téměř nemožné tyto události monitorovat.
Můžete monitorovat zprávy jádra (dmesg). Zdá se to být hloupý nápad. Nebo se podívejte na nějaké soubory v sysfs. Možná lepší způsob je záplatování jádra.
aktualizace: Nechápu, proč tato odpověď získala mnoho negativních hlasů.
Možná někteří lidé kombinují hostitelskou část USB (která produkuje události UDEV při připojení/odpojení zařízení) a část zařízení USB/gadget (která takové události neprodukuje)
Pokud váš linuxový hostitel funguje jako gadget (USB zařízení, které je připojeno k nějakému USB hostiteli), neexistuje žádný dobrý způsob, jak zachytit události plug/unplug.
Důkaz:zpráva od Grega Kroah-Hartmana
další kopie, pokud je předchozí odkaz nefunkční
Pokud chcete mít vše ve svém jediném procesu, budete muset použít libudev k získání událostí z udevd
nebo přímo z jádra.
Vzhledem k tomu, že může být problém použít libudev ve vaší aplikaci (chybí dokumentace?), alternativou je použití programu udevadm, který může:
- nahlásit události zařízení po zpracování pomocí
udevd
(udevadm monitor --udev --property
), - hlásí události devive přímo z jádra (
udevadm monitor --kernel --property
), a - vypsat databázi aktuálních zařízení udevd (ale ne jádra!) (
udevadm info --query all --export-db
)
udevadm
je součástí balíčku udev, ale neměl by potřebovat udevd
pokud jej používáte pouze k hlášení událostí jádra. Můžete jej použít tak, že jej proces vytvoří a analyzuje jeho standardní výstup (ale budete jej muset spustit přes stdbuf -o L
).
Každopádně to bude asi hodně práce. Mnoho z toho jsem již implementoval do svého programovacího jazyka NCD, včetně monitorování USB zařízení. Možná se budete chtít podívat na NCD; je užitečný pro mnoho konfiguračních úloh a dobře zvládá hotplugging. Tento program NCD například vytiskne události zařízení USB na standardní výstup:
process main {
sys.watch_usb() watcher;
println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
watcher->nextevent();
}
To způsobí, že NCD vytiskne něco takového (s počátečním added
událost pro jakékoli zařízení USB, které již bylo připojeno):
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
K tomu můžete také použít NCD a analyzovat toto standardní výstup – se kterým je mnohem snazší pracovat, než si přímo zahrávat s udevadm.
Všimněte si, že samotné NCD používá udevadm
a dělá vyžadovat, aby běžel udevd; ale proč je to vůbec problém? (s trochou práce by tato závislost mohla být odstraněna)