GNU/Linux >> Linux の 問題 >  >> Linux

Linux USB 接続/切断イベント

libudev を使用できます または udevadm を解析します @Ambroz Bizjakが提案したように出力します。ただし、プロセスを追加しないことをお勧めします (stdbuf ) と言語 (NCD )、udevadm の出力を解析するだけです。

単純な libudev と解析出力の間のステップは、udevadm ソースの変更です。このソリューションは、必要なリソースを削減し、解析プロセスを完全にスキップします。 udev パッケージを見ると、udevd と udevadm のソースが udev にあります。 ディレクトリ。

udevadm.c にメイン ルーチンがあります。 udevadm monitor のソース udevadm-monitor.c で .受信したすべてのイベントは print_device() で出力されます .ここにコードを挿入します。

メモリが不足している場合は、control の不要なコードを取り除くことができます 、 infosettletest-builtintesttrigger .私のシステム (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 を実行する必要があります。しかし、とにかくそれが問題なのはなぜですか? (いくつかの作業により、この依存関係は削除される可能性があります)


Linux
  1. 3つの最愛のUSBドライブLinuxディストリビューション

  2. LinuxでUSBドライブを暗号化する - ステップバイステップ

  3. Linux での udevadm コマンドの例

  1. MySQLイベントおよびイベントスケジューラガイド

  2. LinuxでUSB入力ストリームを読み取る

  3. Linux、ソケット、ノンブロッキング接続

  1. LinuxでUSBドライブをフォーマットする方法

  2. KaliLinuxの永続的なUSBを作成する

  3. KaliLinuxにUSBドライブをマウントする方法