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)