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 を実行する必要があります。しかし、とにかくそれが問題なのはなぜですか? (いくつかの作業により、この依存関係は削除される可能性があります)