私のudevルールの1つは、USBストレージデバイスの削除時にスクリプトを実行します。このスクリプトは、一般的なクリーンアップを実行し、ストレージデバイスのマウントポイントディレクトリを削除します。問題は、このロジックをC++アプリケーションからプログラムでトリガーできるようにしたいことです(USBフラッシュドライブがホットスワップで取り外されたときではなく、手遅れになっているようです)。
これを実現する正しい方法は、udevイベントキューにイベントを直接追加することのようです。 udevadmを使用して目的のアクションを実行できますが、libudevライブラリに同等のAPIが表示されません。
udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1
Dbus経由でudevにアクセスしてこれを実現する方法はありますか?これを可能にするライブラリはありますか?これは最終的にudevがどのように機能するかではなく、udevに実行させるのではなく、アプリケーションでブロックデバイスをアンマウントしてクリーンアップする必要がありますか?
探しているのは、/sys
sysfsファイルシステム内のuevent
疑似ファイルのようです。
そのファイル("remove"
など)にコマンドを書き込むことにより、カーネルはそれらをデバイスイベントのユーザースペースハンドラー(udevd)に転送します。
したがって、次のスニペットと同等の処理を実行すると(例ではシェルを使用)、/dev/sda1
デバイスのudev削除を要求して必要な処理を実行できます。
# echo -n "remove" >/sys/class/block/sda1/uevent
Libudev API(たとえば、 dev_device_get_syspath(3) を使用して、特定のデバイスの正しいsysfsパスを見つけることができます。
kobject の下にカーネル側からいくつかのドキュメントがあります。
devdのmanページ の「systemd-udevdがカーネルueventsをリッスンする」など、udevのドキュメントで「uevents」についての言及も見つかります。
しかし、sysfsのuevent
疑似ファイルに関するドキュメントはどこにもないようです...