Jak uruchomić program C ++ po włożeniu dysku flash USB

9

Mam program w C ++, który ma dostęp do pendrivów / pendrive'ów USB. Działa dla aktualnie włożonego dysku flash. Normalny program C ++ nie uruchamia się, dopóki go nie uruchomimy. Chciałem jednak, aby program działał automatycznie po włożeniu dysku flash. Jak mogę to zrobić?

vinayawsm
źródło

Odpowiedzi:

7

Do ogólnego użytku, jeśli chcesz uruchomić swój program dla dowolnej pamięci USB. Użyj sterownika do dopasowania reguły.

  1. Dodaj udevplik reguł

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Dodaj tę regułę

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
    

    Jeśli chcesz, aby twój program rozróżniał dyski, więc uruchamia różne operacje, użyj (możesz przekazać jego numer seryjny lub dowolny atrybut, który ci się podoba):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Załaduj ponownie wszystkie reguły

    sudo udevadm control --reload-rules
    
  4. Odłącz i ponownie podłącz dysk flash

Uwagi:

  • Użyłem tej reguły tylko do przetestowania, który dziennik jest tworzony po uruchomieniu reguły:

    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'"
    
  • Możesz skomentować reguły, których nie chcesz, dodając #na początku wiersza. Plik reguł może zawierać wiele reguł.

  • Aby sprawdzić wszystkie dostępne envzmienne, użyj:

    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'"
    
  • Aby sprawdzić parametry używane do dopasowania reguły, uruchom:

    sudo udevadm info --name=/dev/sdb1 --attribute-walk
    

Bibliografia:

user.dz
źródło
2
Podoba mi się to podejście, upvoting, gratulacje!
Frantique
2
+150: Świetna odpowiedź: (AFAIK lepszy niż zaakceptowany) To ogólna zasada dla każdego urządzenia USB. W zaakceptowanej odpowiedzi USB jest ograniczony do VID i PID.
Helio
5

Możesz użyć udevdo uruchomienia polecenia albitralnego. Aby to działało, utwórz regułę w /etc/udev/rules.d/:

sudo nano /etc/udev/rules.d/my-usb-device.rules

I wprowadź:

ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"

UWAGA: Wartości XXXXi YYYYzostaną pobrane z lsusbwyjścia.

Frantique
źródło
Nie zgadzam się W końcu program C ++ jest „poleceniem”. Użytkownik prosi o rozwiązanie, aby uruchomić to polecenie. (Powiedział: „Ale chciałem, aby program uruchamiał się automatycznie po włożeniu dysku flash. Jak mogłem to zrobić?”)
Frantique
Dla tego [ ideone.com/uOReNj ] wyjścia lsusb, jakie będą wartości XXXXi YYYY?
vinayawsm
Jeśli twój pendrive to Kingston niż: XXXX = 0951, a RRRR = 162f.
Frantique
Czy w celu umożliwienia uruchamiania kodu dla każdego innego pendrive'a należy zawsze aktualizować plik „my-usb-device.rules”?
vinayawsm
Musisz stworzyć regułę dla każdego urządzenia. Lub lepiej refaktoryzuj kod C ++, aby działał jako demon i obserwował wyzwalacze udev.
Frantique