libudev を使用できます または udevadm を解析します @Ambroz Bizjakが提案したように出力します。ただし、プロセスを追加しないことをお勧めします (stdbuf ) と言語 (NCD )、udevadm の出力を解析するだけです。
単純な libudev と解析出力の間のステップは、udevadm ソースの変更です。このソリューションは、必要なリソースを削減し、解析プロセスを完全にスキップします。 udev パッケージを見ると、udevd と udevadm のソースが udev にあります。 ディレクトリ。
udevadm.c にメイン ルーチンがあります。 udevadm monitor のソース udevadm-monitor.c で .受信したすべてのイベントは print_device() で出力されます .ここにコードを挿入します。
メモリが不足している場合は、control の不要なコードを取り除くことができます 、 info 、 settle 、 test-builtin 、 test と trigger .私のシステム (Ubuntu 12.04) では、これにより udevadm のサイズが約 75% 縮小されます。
残念ながら、ガジェット側の接続/切断時に生成される udev イベントがないため、これらのイベントを監視することはほとんど不可能です。
カーネル メッセージ (dmesg) を監視できます。ばかげた考えのようです。または、sysfs 内のいくつかのファイルを監視します。おそらく、より良い方法はカーネル パッチです。
アップデート: この回答が多くの反対票を獲得した理由がわかりません。
USBホスト部分(デバイスのプラグ/アンプラグ時にUDEVイベントを生成する)とUSBデバイス/ガジェット部分(そのようなイベントを生成しない)を混在させる人もいるかもしれません。
Linux ホストがガジェット (USB ホストに接続されている USB デバイス) として機能している場合、プラグ/アンプラグ イベントをキャッチする良い方法はありません。
証明:Greg Kroah-Hartman によるメッセージ
前のリンクがダウンしている場合は別のコピー
単一のプロセスですべてが必要な場合は、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 を介して起動する必要があります)。 ).
いずれにしても大変な作業になりそうです。 USB デバイスの監視を含め、NCD プログラミング言語で既に多くのことを実装しています。 NCD を参照してください。多くの構成タスクに役立ち、ホットプラグをうまく処理します。たとえば、次の 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 を使用して、this を解析することもできます。 標準出力 - これは、直接 udevadm をいじるよりもはるかに簡単に操作できます。
NCD 自体は udevadm を使用することに注意してください 、そしてそう udevd を実行する必要があります。しかし、とにかくそれが問題なのはなぜですか? (いくつかの作業により、この依存関係は削除される可能性があります)