每当插入 U 盘时如何执行 C++ 程序

vin*_*wsm 9 usb-drive usb udev c++

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

use*_*.dz 7

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

  1. 添加udev规则文件

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加此规则

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
    
    Run Code Online (Sandbox Code Playgroud)

    如果你想让你的程序区分磁盘,所以它运行不同的操作,使用(你可以传递它的序列号或任何你喜欢的属性):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新加载所有规则

    sudo udevadm control --reload-rules
    
    Run Code Online (Sandbox Code Playgroud)
  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'"
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以通过添加#到行首来注释不需要的规则。规则文件可以包含多个规则。

  • 要检查所有可用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'"
    
    Run Code Online (Sandbox Code Playgroud)
  • 要检查用于规则匹配的参数,请运行:

    sudo udevadm info --name=/dev/sdb1 --attribute-walk
    
    Run Code Online (Sandbox Code Playgroud)

参考:

  • 我喜欢这种方法,点赞,恭喜! (2认同)
  • +150:很好的答案:(AFAIK 比接受更好)它为任何 USB 设备制定了一般规则。在接受的答案中,USB 仅限于 VID 和 PID。 (2认同)

Fra*_*que 5

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

sudo nano /etc/udev/rules.d/my-usb-device.rules
Run Code Online (Sandbox Code Playgroud)

并输入:

ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"
Run Code Online (Sandbox Code Playgroud)

注:XXXXYYYY值将取lsusb输出。