Come eseguire il programma C ++ ogni volta che viene inserita un'unità flash USB


9

Ho un programma C ++ che accede a pen drive / flash drive USB. Funziona con l'unità flash attualmente inserita. Un normale programma C ++ non viene eseguito fino a quando non lo eseguiamo. Volevo che il programma si eseguisse automaticamente ogni volta che si inserisce un'unità flash. Come lo posso fare?

Risposte:


7

Per uso generale, se si desidera eseguire il programma per qualsiasi memoria USB. Usa il driver per la corrispondenza delle regole.

  1. Aggiungi un udevfile di regole

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Aggiungi questa regola

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

    Se vuoi che il tuo programma distingua i dischi, quindi esegue diverse operazioni, usa (puoi passare il suo numero seriale o qualsiasi attributo che ti piace):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Ricarica tutte le regole

    sudo udevadm control --reload-rules
    
  4. Scollegare e ricollegare l'unità flash

Appunti:

  • Ho usato questa regola solo per testare quale creare un registro quando viene attivata la regola:

    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'"
    
  • Puoi commentare le regole che non desideri aggiungendo #all'inizio della riga. Il file delle regole può contenere più regole.

  • Per controllare tutte le envvariabili disponibili , utilizzare:

    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'"
    
  • Per verificare i parametri da utilizzare per la corrispondenza delle regole, eseguire:

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

Riferimenti:


2
Mi piace questo approccio, votazione, complimenti!
Frantique,

2
+150: Ottima risposta: (AFAIK meglio di quanto accettato) Rende una regola generale per qualsiasi dispositivo USB. Nella risposta accettata l'USB è limitata a un VID e un PID.
Helio,

5

È possibile utilizzare udevper eseguire un comando albitrario. Per farlo funzionare, crea una regola in /etc/udev/rules.d/:

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

E inserisci:

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

NOTA: i valori XXXXe YYYYverranno presi lsusbdall'output.


Non sono d'accordo Dopo tutto, il programma C ++ è un "comando". L'utente chiede una soluzione per attivare quel comando. (Ha detto: "Ma volevo che il programma si
eseguisse

Per questo [ ideone.com/uOReNj ] output di lsusb, quali saranno i valori di XXXXe YYYY?
vinayawsm,

Se il tuo pendrive è il Kingston di: XXXX = 0951 e YYYY = 162f.
Frantique,

Per consentire l'attivazione del mio codice per ogni diversa pen drive, devo sempre aggiornare il file "my-usb-device.rules"?
vinayawsm,

Devi creare una regola per ogni dispositivo. O meglio refactificare il codice C ++ in modo che venga eseguito come demone e osservare i trigger udev.
Frantique,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.