J'ai un programme C++ qui accède aux clés USB/clés USB. 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 ça?
Pour une utilisation générale, si vous souhaitez exécuter votre programme pour un stockage USB. Utilisez le pilote pour la correspondance de règle.
Ajouter un fichier de règles udev
Sudo 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 souhaitez que votre programme distingue les disques, afin qu'il exécute différentes opérations, utilisez (vous pouvez transmettre son numéro de série ou tout attribut de votre choix):
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
Notes:
J'ai utilisé cette règle uniquement pour tester la création d'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 toutes les variables env
disponibles, 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ègles, exécutez:
Sudo udevadm info --name=/dev/sdb1 --attribute-walk
Références:
Vous pouvez utiliser udev
pour exécuter une commande albitrary. Pour que cela fonctionne, créez une règle dans /etc/udev/rules.d/
:
Sudo nano /etc/udev/rules.d/my-usb-device.rules
Et entrez:
ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"
NOTE: Les valeurs XXXX
et YYYY
seront extraites de la sortie lsusb
.