Cara menjalankan program C ++ setiap kali USB flash drive dimasukkan

9

Saya memiliki program C ++ yang mengakses pen drive USB / flash drive. Ini berfungsi untuk flash drive yang saat ini dimasukkan. Program C ++ normal tidak dijalankan sampai kita menjalankannya. Tetapi saya ingin program berjalan secara otomatis setiap kali flash drive dimasukkan. Bagaimana saya bisa melakukan itu?

vinayawsm
sumber

Jawaban:

7

Untuk penggunaan umum, Jika Anda ingin menjalankan program Anda untuk penyimpanan USB apa pun. Gunakan driver untuk pertandingan yang sesuai aturan.

  1. Tambahkan udevfile aturan

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Tambahkan aturan ini

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

    Jika Anda ingin program Anda membedakan disk, sehingga menjalankan operasi yang berbeda, gunakan (Anda dapat memberikan nomor seri atau atribut apa pun yang Anda suka):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Muat ulang semua aturan

    sudo udevadm control --reload-rules
    
  4. Cabut dan pasang kembali flash drive

Catatan:

  • Saya menggunakan aturan ini hanya untuk menguji yang membuat log ketika aturan dipicu:

    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'"
    
  • Anda dapat mengomentari aturan yang tidak Anda inginkan dengan menambahkan #ke awal baris. File aturan dapat berisi banyak aturan.

  • Untuk memeriksa semua envvariabel yang tersedia , gunakan:

    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'"
    
  • Untuk memeriksa parameter yang digunakan untuk pencocokan aturan, jalankan:

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

Referensi:

user.dz
sumber
2
Saya suka pendekatan ini, upvoting, selamat!
Frantique
2
+150: Jawaban luar biasa: (AFAIK lebih baik dari yang diterima) Itu membuat aturan umum untuk semua perangkat USB. Dalam jawaban yang diterima USB dibatasi untuk VID dan PID.
Helio
5

Anda dapat menggunakan udevuntuk menjalankan perintah arbitrer. Untuk membuatnya berfungsi, buat aturan di /etc/udev/rules.d/:

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

Dan masukkan:

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

CATATAN: Nilai XXXXdan YYYYakan diambil dari lsusboutput.

Frantique
sumber
Saya tidak setuju. Program C ++ adalah "perintah" setelah semua. Pengguna meminta solusi untuk memicu perintah itu. (Dia berkata: "Tapi saya ingin program berjalan secara otomatis setiap kali flash drive dimasukkan. Bagaimana saya bisa melakukan itu?")
Frantique
Untuk output lsusb [ ideone.com/uOReNj ] ini, apa yang akan menjadi nilai XXXXdan YYYY?
vinayawsm
Jika flashdisk Anda adalah Kingston daripada: XXXX = 0951, dan YYYY = 162f.
Frantique
Untuk membiarkan pemicu kode saya untuk setiap pen drive yang berbeda, haruskah saya selalu memperbarui file "my-usb-device.rules"?
vinayawsm
Anda harus membuat aturan untuk setiap perangkat. Atau lebih baik refactor kode C ++ Anda untuk dijalankan sebagai daemon dan amati pemicu udev.
Frantique