Cómo ejecutar el programa C ++ cada vez que se inserta una unidad flash USB

9

Tengo un programa C ++ que accede a pen drives / flash drives USB. Funciona para la unidad flash insertada actualmente. Un programa normal de C ++ no se ejecuta hasta que lo ejecutamos. Pero quería que el programa se ejecute automáticamente cada vez que se inserta una unidad flash. ¿Cómo puedo hacer eso?

vinayawsm
fuente

Respuestas:

7

Para uso general, si desea ejecutar su programa para cualquier almacenamiento USB. Use el controlador para la coincidencia de reglas.

  1. Agregar un udevarchivo de reglas

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Agregar esta regla

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
    

    Si desea que su programa distinga los discos, por lo que ejecuta diferentes operaciones, use (puede pasar su número de serie o cualquier atributo que desee):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Recargar todas las reglas

    sudo udevadm control --reload-rules
    
  4. Desenchufe y vuelva a conectar la unidad flash

Notas:

  • Usé esta regla solo para probar qué crear un registro cuando se activa la regla:

    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'"
    
  • Puede comentar las reglas que no desea agregando #al comienzo de la línea. El archivo de reglas puede contener múltiples reglas.

  • Para verificar todas las envvariables disponibles , use:

    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'"
    
  • Para verificar los parámetros que se usarán para la coincidencia de reglas, ejecute:

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

Referencias

user.dz
fuente
2
¡Me gusta este enfoque, la votación, felicidades!
Frantique
2
+150: Gran respuesta: (AFAIK mejor de lo aceptado) Hace una regla general para cualquier dispositivo USB. En la respuesta aceptada, el USB está restringido a un VID y un PID.
Helio
5

Puede usar udevpara ejecutar un comando albitrario. Para que funcione, cree una regla en /etc/udev/rules.d/:

sudo nano /etc/udev/rules.d/my-usb-device.rules

Y entra:

ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"

NOTA: Los valores XXXXy YYYYse tomarán de la lsusbsalida.

Frantique
fuente
No estoy de acuerdo El programa C ++ es un "comando" después de todo. El usuario solicita una solución para activar ese comando. (Dijo: "Pero quería que el programa se ejecute automáticamente cada vez que se inserte una unidad flash. ¿Cómo podría hacer eso?")
Frantique
Para esta salida [ ideone.com/uOReNj ] de lsusb, ¿cuáles serán los valores de XXXXy YYYY?
vinayawsm
Si su pendrive es el Kingston que: XXXX = 0951, y AAAA = 162f.
Frantique
Para permitir que mi código se active para cada pen drive diferente, ¿debo actualizar siempre el archivo "my-usb-device.rules"?
vinayawsm
Debe crear una regla para cada dispositivo. O mejor refactorice su código de C ++ para que se ejecute como daemon y observe los desencadenantes de udev.
Frantique