Як виконати програму C ++ щоразу, коли вставлено флешку


9

У мене є програма C ++, яка отримує доступ до USB-накопичувачів / флешок. Він працює для поточно вставленої флешки. Звичайна програма C ++ не виконується, поки ми не запустимо її. Але я хотів, щоб програма запускалася автоматично, коли вставлена ​​флешка. Як я можу це зробити?

Відповіді:


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
Мені подобається такий підхід, підтримка, привітання!
Франтик

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виводу.


Я не згоден. Програма C ++ - це "команда". Користувач просить рішення, щоб запустити цю команду. (Він сказав: "Але я хотів, щоб програма автоматично запускалася щоразу, коли вставлена ​​флешка. Як я можу це зробити?")
Франтик

Для цього [ ideone.com/uOReNj ] виведення lsusb, якими будуть значення XXXXі YYYY?
vinayawsm

Якщо ваш маятник є Кінгстоном, ніж: XXXX = 0951, і YYYY = 162f.
Франтик

Щоб дозволити мій код тригера для кожного різного приводу ручки, чи повинен я завжди оновлювати файл "my-usb-device.rules"?
vinayawsm

Вам потрібно створити правило для кожного пристрою. Або краще перефактуруйте свій C ++ код, щоб він працював як демон і спостерігав тригери udev.
Франтик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.