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

我有一个C++程序,可以访问USB闪存驱动器。它可以用于当前插入的闪存驱动器。通常情况下,C++程序需要手动运行才能执行。但是我希望程序在插入闪存驱动器时自动运行。我该如何实现这个功能?
2个回答

一般情况下,如果您想要在任何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:非常好的回答(据我所知比被接受的回答更好)。它为任何USB设备制定了一个通用规则。在被接受的回答中,USB仅限于一个VID和一个PID。 - 0x2b3bfa0

你可以使用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"

注意:XXXX和YYYY的值将从lsusb输出中获取。

我不同意。C++程序毕竟是一个“命令”。用户正在寻求触发该命令的解决方案。(他说:“但是我希望程序在插入闪存驱动器时自动运行。我该怎么做呢?”) - Frantique
对于这个 [http://ideone.com/uOReNj] 的 lsusb 输出,XXXXYYYY 的值将是什么? - vinayawsm
如果您的U盘是金士顿的话,那么XXXX=0951,YYYY=162f。 - Frantique
为了让我的代码对每个不同的U盘都触发,我是否需要始终更新“my-usb-device.rules”文件? - vinayawsm
你需要为每个设备创建规则。或者更好的做法是重构你的C++代码,使其作为守护进程运行并观察udev触发器。 - Frantique