Como executar o programa C ++ sempre que uma unidade flash USB é inserida

9

Eu tenho um programa C ++ que acessa pen drives / pen drives. Ele funciona para a unidade flash atualmente inserida. Um programa C ++ normal não é executado até executá-lo. Mas eu queria que o programa fosse executado automaticamente sempre que uma unidade flash fosse inserida. Como eu posso fazer isso?

vinayawsm
fonte

Respostas:

7

Para uso geral, se você deseja executar o seu programa para qualquer armazenamento USB. Use o driver para a correspondência de regras.

  1. Adicionar um udevarquivo de regras

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Adicione esta regra

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

    Se você deseja que seu programa diferencie os discos, execute operações diferentes, use (você pode passar o número de série ou qualquer atributo que desejar):

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

    sudo udevadm control --reload-rules
    
  4. Desconecte e reconecte a unidade flash

Notas:

  • Eu usei essa regra apenas para testar quais criar um log quando a regra for acionada:

    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'"
    
  • Você pode comentar as regras que não deseja, adicionando #ao início da linha. O arquivo de regras pode conter várias regras.

  • Para verificar todas as envvariáveis disponíveis , 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 os parâmetros a serem usados ​​na correspondência de regras, execute:

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

Referências:

user.dz
fonte
2
Eu gosto dessa abordagem, voto positivo, parabéns!
Frantique
2
+150: Ótima resposta: (AFAIK é melhor que aceito) Faz uma regra geral para qualquer dispositivo USB. Na resposta aceita, o USB é restrito a um VID e um PID.
Helio
5

Você pode usar udevpara executar um comando albitrário. Para fazê-lo funcionar, crie uma regra em /etc/udev/rules.d/:

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

E entre:

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

NOTA: Os valores XXXXe YYYYserão retirados da lsusbsaída.

Frantique
fonte
Eu não concordo O programa C ++ é um "comando", afinal. O usuário está solicitando uma solução para acionar esse comando. (Ele disse: "Mas eu queria que o programa fosse executado automaticamente sempre que uma unidade flash fosse inserida. Como eu poderia fazer isso?")
Frantique
Para esta saída [ ideone.com/uOReNj ] de lsusb, quais serão os valores de XXXXe YYYY?
Vinayawsm #
Se o seu pendrive for o Kingston, então: XXXX = 0951 e AAAA = 162f.
Frantique
Para permitir que meu código seja acionado para cada pen drive diferente, devo sempre atualizar o arquivo "my-usb-device.rules"?
Vinayawsm #
Você precisa criar regras para todos os dispositivos. Ou melhor refatorar seu código C ++ para executar como daemon e observar os gatilhos do udev.
Frantique