私のudevルールの1つはUSBストレージデバイスを削除するスクリプトを実行します。このスクリプトはいくつかの一般的なクリーンアップを実行し、ストレージデバイスのマウントポイントディレクトリを削除します。問題は、USBフラッシュドライブがホットプラグによって取り外されたときにトリガーするのではなく、C ++アプリケーションでプログラム的にこのロジックをトリガーできるようにしたいということです。遅すぎるようです。
これを達成する正しい方法は、イベントをudevイベントキューに直接追加することです。 udevadmを使用して目的を達成できましたが、libudevライブラリには対応するAPIが表示されません。
udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1
これを達成するためにdbusを介してudevにアクセスする方法はありますか?これを行うことができるライブラリはありますか?これは最終的にudevが動作する方法ではありませんか? udevが実行するのではなく、アプリケーションでブロックデバイスをアンマウントしてクリーンアップする必要がありますか?
答え1
あなたが探しているのはsysfsファイルシステムuevent
にある擬似ファイルのようです/sys
。
"remove"
カーネルはこのファイル(たとえば)にコマンドを作成し、これらのコマンドをデバイスイベントのユーザースペースハンドラ(udevdなど)に渡します。
したがって、次のコードスニペット(シェルを例として使用)と同じ操作を実行すると、udevにデバイスの削除を要求して目的の結果を得ることができます/dev/sda1
。
# echo -n "remove" >/sys/class/block/sda1/uevent
libudev APIを使用できます(例:udev_device_get_syspath(3)特定のデバイスへの正しいsysfsパスを見つけるのに役立ちます。
以下のカーネルに関するドキュメントを見つけることができます。オブジェクト。
udev ドキュメントでは、「systemd-udevd がカーネル uevents を受け取る」などの「uevents」への言及を見つけることもできます。udevd のマニュアルページ。
uevent
しかし、sysfs擬似ファイルに関するドキュメントはあまりないようです。