Comment exécuter le programme C ++ chaque fois qu'un lecteur flash USB est inséré

9

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 que lorsque nous l'exécutons. Mais je voulais que le programme s'exécute automatiquement chaque fois qu'un lecteur flash est inséré. Comment puis je faire ça?

vinayawsm
la source

Réponses:

7

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.

  1. Ajouter un udevfichier de règles

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. 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 transmettre 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}"
    
  3. Recharger toutes les règles

    sudo udevadm control --reload-rules
    
  4. Débranchez et rebranchez le lecteur flash

Remarques:

  • J'ai utilisé cette règle juste 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 souhaitez pas en ajoutant #au début de la ligne. Le fichier de règles peut contenir plusieurs règles.

  • Pour vérifier toutes les envvariables 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 des règles, exécutez:

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

Références:

user.dz
la source
2
J'aime cette approche, vote positif, félicitations!
Frantique
2
+150: Grande réponse: (AFAIK mieux qu'accepté) Cela fait une règle générale pour tout périphérique USB. Dans la réponse acceptée, l'USB est limité à un VID et à un PID.
Helio
5

Vous pouvez utiliser udevpour exécuter une commande arbitraire. Pour le faire fonctionner, 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"

REMARQUE: Les valeurs XXXXet YYYYseront extraites de la lsusbsortie.

Frantique
la source
Je ne suis pas d'accord. Le programme C ++ est une "commande" après tout. L'utilisateur demande une solution pour déclencher cette commande. (Il a dit: "Mais je voulais que le programme s'exécute automatiquement chaque fois qu'un lecteur flash est inséré. Comment pourrais-je faire cela?")
Frantique
Pour cette sortie [ ideone.com/uOReNj ] de lsusb, quelles seront les valeurs de XXXXet YYYY?
vinayawsm
Si votre clé USB est le Kingston, alors: XXXX = 0951 et YYYY = 162f.
Frantique
Pour laisser mon code se déclencher pour chaque clé USB, dois-je toujours mettre à jour le fichier "my-usb-device.rules"?
vinayawsm
Vous devez créer une règle pour chaque appareil. Ou mieux refactorisez votre code C ++ pour qu'il s'exécute en tant que démon et observez les déclencheurs udev.
Frantique