我有一个C++程序,可以访问USB闪存驱动器。它可以用于当前插入的闪存驱动器。通常情况下,C++程序需要手动运行才能执行。但是我希望程序在插入闪存驱动器时自动运行。我该如何实现这个功能?
添加一个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
参考资料:
sudo nano /etc/udev/rules.d/my-usb-device.rules
并输入:
ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"
XXXX
和 YYYY
的值将是什么? - vinayawsm