Tengo un programa C++ que accede a pen drives/flash drives USB. Funciona para la unidad flash actualmente insertada. Un programa C++ normal no se ejecuta hasta que lo ejecutamos. Pero quería que el programa se ejecutara automáticamente cada vez que se inserta una unidad flash. ¿Cómo puedo hacer eso?
Respuesta aceptada:
Para uso general, si desea ejecutar su programa para cualquier almacenamiento USB. Utilice el controlador para la coincidencia de reglas.
-
Agregar un
udev
archivo de reglassudo nano /etc/udev/rules.d/90-detect-storage.rules
-
Añadir esta regla
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
Si desea que su programa distinga los discos, para que ejecute 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}"
-
Recargar todas las reglas
sudo udevadm control --reload-rules
-
Desconecte y vuelva a conectar la unidad flash
Notas:
-
Usé esta regla solo para probar cuál crea 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 varias reglas. -
Para comprobar todos los
env
disponibles variables, utilice: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 comprobar los parámetros que se utilizarán para la coincidencia de reglas, ejecute:
sudo udevadm info --name=/dev/sdb1 --attribute-walk
Referencias:
- Pase ATTR{idVendor} como argumento en el script udev
- Escribiendo las reglas de udev por Daniel Drake