Bir USB flash sürücü takıldığında C ++ programı nasıl çalıştırılır


9

USB kalem sürücülere / flash sürücülere erişen bir C ++ programım var. Şu anda takılı olan flash sürücü için çalışır. Biz çalışana kadar normal bir C ++ programı çalışmaz. Ancak bir flash sürücü takıldığında programın otomatik olarak çalışmasını istedim. Bunu nasıl yapabilirim?

Yanıtlar:


7

Genel kullanım için, programınızı herhangi bir USB depolama birimi için çalıştırmak istiyorsanız. Kural eşleşmesi için sürücüyü kullanın.

  1. udevKural dosyası ekle

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Bu kuralı ekle

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

    Programınızın diskleri ayırt etmesini istiyorsanız, farklı işlemler gerçekleştirmesini istiyorsanız, kullanın (seri numarasını veya istediğiniz herhangi bir özelliği iletebilirsiniz):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Tüm kuralları yeniden yükle

    sudo udevadm control --reload-rules
    
  4. Flash sürücüyü çıkarın ve yeniden takın

Notlar:

  • Ben sadece kural tetiklendiğinde hangi günlük oluşturmak test etmek için bu kuralı kullandım:

    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'"
    
  • #Satır başına ekleyerek istemediğiniz kuralları yorumlayabilirsiniz. Kurallar dosyası birden çok kural içerebilir.

  • Mevcut tüm envdeğişkenleri kontrol etmek için şunu kullanın:

    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'"
    
  • Kural eşleşmesi için kullanılacak parametreleri kontrol etmek için şunu çalıştırın:

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

Referanslar:


2
Bu yaklaşımı seviyorum, oylama, tebrikler!
Frantique

2
+150: Harika cevap: (AFAIK kabul edilenden daha iyi) Herhangi bir USB cihazı için genel bir kural oluşturur. Kabul edilen cevapta USB bir VID ve PID ile sınırlıdır.
Helio

5

udevBir albitrary komutu çalıştırmak için kullanabilirsiniz . Çalışmasını sağlamak için bir kural oluşturun /etc/udev/rules.d/:

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

Ve şunu girin:

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

NOT:XXXX ve YYYYdeğerler alınacaktır lsusbçıktı.


Kabul etmiyorum. Sonuçta C ++ programı bir "komut" dur. Kullanıcı bu komutu tetiklemek için bir çözüm istiyor. ("Ama bir flash sürücü takıldığında programın otomatik olarak çalışmasını istedim. Bunu nasıl yapabilirim?")
Frantique

Bu [For ideone.com/uOReNj lsusb ait] çıkışı, ne değerleri olacak XXXXve YYYY?
vinayawsm

Pendrive'ınız Kingston ise: XXXX = 0951 ve YYYY = 162f.
Frantique

Kodumun her farklı kalem sürücüsü için tetiklenmesine izin vermek için her zaman "my-usb-device.rules" dosyasını güncellemeli miyim?
vinayawsm

Her cihaz için kural oluşturmanız gerekir. Ya da daha iyi bir C ++ kodunu daemon olarak çalıştırmak ve udev tetikleyicileri gözlemlemek için refactor.
Frantique
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.