J'ai un programme C++ qui accède aux clés USB/lecteurs flash. Cela fonctionne pour le lecteur flash actuellement inséré. Un programme C++ normal ne s'exécute pas tant que nous ne l'avons pas exécuté. Mais je voulais que le programme s'exécute automatiquement chaque fois qu'un lecteur flash est inséré. Comment puis-je faire cela ?
Réponse acceptée :
Pour une utilisation générale, si vous souhaitez exécuter votre programme pour n'importe quel stockage USB. Utilisez le pilote pour la correspondance de règle.
-
Ajouter un
udev
fichier de règlessudo nano /etc/udev/rules.d/90-detect-storage.rules
-
Ajouter cette règle
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
Si vous voulez que votre programme distingue les disques, afin qu'il exécute différentes opérations, utilisez (vous pouvez passer son numéro de série ou tout attribut que vous aimez) :
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
-
Recharger toutes les règles
sudo udevadm control --reload-rules
-
Débranchez et rebranchez le lecteur flash
Remarques :
-
J'ai utilisé cette règle juste pour tester qui crée un journal lorsque la règle est déclenchée :
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'"
-
Vous pouvez commenter les règles que vous ne voulez pas en ajoutant
#
au début de la ligne. Le fichier de règles peut contenir plusieurs règles. -
Pour vérifier tous les
env
disponibles variables, utilisez :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'"
-
Pour vérifier les paramètres à utiliser pour la correspondance de règle, exécutez :
sudo udevadm info --name=/dev/sdb1 --attribute-walk
Références :
- Passez ATTR{idVendor} comme argument dans le script udev
- Rédaction des règles udev par Daniel Drake