GNU/Linux >> Znalost Linux >  >> Linux

událost linux usb connect/disconnect

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)


Linux
  1. 3 oblíbené USB disky Linuxové distribuce

  2. Šifrování jednotky USB v systému Linux – krok za krokem

  3. Příklady příkazů udevadm v Linuxu

  1. Průvodce událostmi a plánovačem událostí MySQL

  2. Čtení vstupního USB datového proudu na linuxu

  3. Linux, sockety, neblokovací připojení

  1. Jak formátovat USB disky v Linuxu

  2. Vytvořte Kali Linux Persistent USB

  3. Jak připojit USB disk na Kali Linux