USBペンドライブ/フラッシュドライブにアクセスするC++プログラムがあります。現在挿入されているフラッシュドライブで動作します。通常のC++プログラムは、実行するまで実行されません。しかし、フラッシュドライブが挿入されるたびにプログラムが自動的に実行されるようにしたかったのです。どうすればそれができますか?
承認された回答:
一般的な使用のために、任意のUSBストレージに対してプログラムを実行したい場合。ルール一致のドライバーを使用します。
-
udev
を追加します ルールファイルsudo nano /etc/udev/rules.d/90-detect-storage.rules
-
このルールを追加
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
プログラムでディスクを区別して、さまざまな操作を実行する場合は、次を使用します(シリアル番号または任意の属性を渡すことができます):
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
-
すべてのルールをリロードします
sudo udevadm control --reload-rules
-
フラッシュドライブを抜き差し
注:
-
このルールは、ルールがトリガーされたときにログを作成するものをテストするためだけに使用しました。
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo $env{ID_VENDOR_ID} $env{ID_MODEL_ID} >> /home/username/Desktop/usb-storage.log'"
-
#
を追加することで、不要なルールにコメントを付けることができます 行頭まで。ルールファイルには複数のルールを含めることができます。 -
利用可能なすべての
env
を確認するには 変数、使用:ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh -c 'echo == >> /home/username/Desktop/usb-storage-env.log; env >> /home/username/Desktop/usb-storage-env.log'"
-
ルールの一致に使用するパラメーターを確認するには、次のコマンドを実行します。
sudo udevadm info --name=/dev/sdb1 --attribute-walk
参照:
- udevスクリプトの引数としてATTR{idVendor}を渡します
- DanielDrakeによるudevルールの作成