Как запустить программу на C ++, когда вставлена ​​флешка

9

У меня есть программа C ++, которая обращается к флеш-накопителям USB. Работает на вставленной в данный момент флешке. Обычная программа на C ++ не выполняется, пока мы ее не запустим. Но я хотел, чтобы программа запускалась автоматически при установке флешки. Как я могу это сделать?

vinayawsm
источник

Ответы:

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
    

Ссылки:

user.dz
источник
2
Мне нравится такой подход, голосование, поздравляю!
Frantique
2
+150: Отличный ответ: (AFAIK лучше, чем принято). Это общее правило для любого USB-устройства. В принятом ответе USB ограничен VID и PID.
Гелио
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"

ПРИМЕЧАНИЕ. Значения XXXXи YYYYбудут взяты из lsusbвывода.

Frantique
источник
Я не согласна В конце концов, программа на C ++ - это «команда». Пользователь запрашивает решение для запуска этой команды. (Он сказал: «Но я хотел, чтобы программа запускалась автоматически при вставке флешки. Как я могу это сделать?»)
Frantique
Для этого [ ideone.com/uOReNj ] вывода lsusb, каковы будут значения XXXXи YYYY?
vinayawsm
Если ваш pendrive - Kingston, тогда: XXXX = 0951 и YYYY = 162f.
Frantique
Для того, чтобы мой код срабатывал для каждого отдельного дисковода, должен ли я всегда обновлять файл "my-usb-device.rules"?
vinayawsm
Вы должны создать правило для каждого устройства. Или лучше реорганизовать код C ++, чтобы он работал как демон и наблюдал за триггерами udev.
Frantique