如何在插入USB闪存驱动器时执行C ++程序

我有一个访问USB笔式驱动器/闪存驱动器的C ++程序。 它适用于当前插入的闪存驱动器。 正常的C ++程序在运行之前不会执行。 但是我想让程序在插入闪存驱动器时自动运行。 我怎样才能做到这一点?

对于一般用途,如果您想为任何USB存储器运行程序。 使用驱动程序进行规则匹配。

  1. 添加udev规则文件

     sudo nano /etc/udev/rules.d/90-detect-storage.rules 
  2. 添加此规则

     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}" 
  3. 重新加载所有规则

     sudo udevadm control --reload-rules 
  4. 拔下并重新插入闪存驱动器

笔记:

  • 我使用此规则来测试触发规则时创建日志的原因:

     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 

参考文献:

  • 将ATTR {idVendor}作为参数传递给udev脚本
  • 编写 Daniel Drake的udev规则

您可以使用udev运行任意命令。 要使其工作,请在/etc/udev/rules.d/创建规则:

 sudo nano /etc/udev/rules.d/my-usb-device.rules 

并输入:

 ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command" 

注意: XXXXYYYY值将取自lsusb输出。