Ho un programma C++ che accede a pen drive USB/unità flash. Funziona con l'unità flash attualmente inserita. Un normale programma C++ non viene eseguito finché non lo eseguiamo. Ma volevo che il programma venisse eseguito automaticamente ogni volta che viene inserita un'unità flash. Come posso farlo?
Risposta accettata:
Per uso generale, se desideri eseguire il tuo programma per qualsiasi memoria USB. Usa il driver per la corrispondenza delle regole.
-
Aggiungi un
udev
file delle regolesudo nano /etc/udev/rules.d/90-detect-storage.rules
-
Aggiungi questa regola
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
Se vuoi che il tuo programma distingua i dischi, in modo che esegua diverse operazioni, usa (puoi passare il suo numero di serie o qualsiasi attributo che ti piace):
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
-
Ricarica tutte le regole
sudo udevadm control --reload-rules
-
Scollega e ricollega l'unità flash
Note:
-
Ho usato questa regola solo per testare quale crea un registro quando la regola viene attivata:
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 tutti gli
env
disponibili variabili, 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, esegui:
sudo udevadm info --name=/dev/sdb1 --attribute-walk
Riferimenti:
- Passa ATTR{idVendor} come argomento nello script udev
- Scrivere regole udev di Daniel Drake