web-dev-qa-db-fra.com

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

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?

9
vinayawsm

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.

  1. Ajouter un fichier de règles udev

    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 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}"
    
  3. Recharger toutes les règles

    Sudo udevadm control --reload-rules
    
  4. 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:

7
user.dz

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.

5
Frantique