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


9

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

Answers:


7

对于一般用途,如果您想为任何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
    

参考文献:


2
我喜欢这种方法,很高兴,恭喜!
Frantique

2
+150:很好的答案:(优于接受的AFAIK)它是所有USB设备的通用规则。在接受的答案中,USB被限制为VID和PID。
Helio

5

您可以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输出。


我不同意 毕竟,C ++程序是一个“命令”。用户正在寻求触发该命令的解决方案。(他说:“但是我希望程序在插入闪存驱动器时自动运行。我该怎么做?”)
Frantique 2015年

对于lsusb的this [ ideone.com/uOReNj ]输出,XXXXand 的值是YYYY什么?
vinayawsm 2015年

如果您的笔式驱动器是Kingston,则为:XXXX = 0951,并且YYYY = 162f。
弗兰提克(Frantique)

为了让我的代码为每个不同的笔式驱动器触发,我是否应该始终更新“ my-usb-device.rules”文件?
vinayawsm 2015年

您必须为每个设备创建规则。或者更好地重构您的C ++代码以使其作为守护程序运行并观察udev触发器。
弗兰提克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.