How to execute C++ program whenever a USB flash drive is inserted

5,075

Solution 1

For general use, If you would like to run your program for any USB storage. Use the driver for the rule match.

  1. Add a udev rules file

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Add this rule

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

    If you want your program to distinguish the disks, so it runs different operations, use (you can pass its serial number or any attribute you like):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Reload all rules

    sudo udevadm control --reload-rules
    
  4. Unplug and replug the flash drive

Notes:

  • I used this rule just to test which create a log when the rule is triggered:

    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'"
    
  • You can comment the rules you don't want by adding # to the beginning of the line. Rules file can contain multiple rules.

  • To check all the available env variables, 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'"
    
  • To check for parameters to use for rule match, run:

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

References:

Solution 2

You can use udev to run an albitrary command. To make it work, create a rule in /etc/udev/rules.d/:

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

And enter:

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

NOTE: The XXXX and YYYY values will be taken from lsusb output.

Share:
5,075

Related videos on Youtube

vinayawsm
Author by

vinayawsm

Updated on September 18, 2022

Comments

  • vinayawsm
    vinayawsm over 1 year

    I have a C++ program that accesses USB pen drives/flash drives. It works for currently inserted flash drive. A normal C++ program doesn't execute until we run it. But I wanted the program to run automatically whenever a flash drive is inserted. How can I do that?

  • m. öztürk
    m. öztürk about 9 years
    I don't agree. The C++ program is a "command" after all. The user is asking for a solution to trigger that command. (He said: " But I wanted the program to run automatically whenever a flash drive is inserted. How could I do that?")
  • vinayawsm
    vinayawsm about 9 years
    For this[ ideone.com/uOReNj ] output of lsusb, what will be the values of XXXX and YYYY?
  • vinayawsm
    vinayawsm about 9 years
    For letting my code trigger for every different pen drive, should I always update the "my-usb-device.rules" file?
  • 0x2b3bfa0
    0x2b3bfa0 almost 9 years
    +150: Great answer: (AFAIK better than accepted) It makes a general rule for any USB device. In the acccepted answer the USB is restricted to a VID and a PID.