So führen Sie ein C ++ - Programm aus, wenn ein USB-Flash-Laufwerk angeschlossen ist

9

Ich habe ein C ++ - Programm, das auf USB-Sticks / Flash-Laufwerke zugreift. Es funktioniert für aktuell eingelegte Flash-Laufwerke. Ein normales C ++ - Programm wird erst ausgeführt, wenn wir es ausführen. Ich wollte jedoch, dass das Programm automatisch ausgeführt wird, wenn ein Flash-Laufwerk eingesetzt wird. Wie kann ich das machen?

vinayawsm
quelle

Antworten:

7

Für den allgemeinen Gebrauch, wenn Sie Ihr Programm für einen USB-Speicher ausführen möchten. Verwenden Sie den Treiber für die Regelübereinstimmung.

  1. Fügen Sie eine udevRegeldatei hinzu

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Fügen Sie diese Regel hinzu

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

    Wenn Ihr Programm die Datenträger unterscheiden soll, damit verschiedene Vorgänge ausgeführt werden, verwenden Sie (Sie können die Seriennummer oder ein beliebiges Attribut übergeben):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Laden Sie alle Regeln neu

    sudo udevadm control --reload-rules
    
  4. Trennen Sie das Flash-Laufwerk vom Computer und schließen Sie es erneut an

Anmerkungen:

  • Ich habe diese Regel nur verwendet, um zu testen, welche beim Auslösen der Regel ein Protokoll erstellen:

    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'"
    
  • Sie können die Regeln, die Sie nicht möchten, kommentieren, indem Sie #sie am Zeilenanfang hinzufügen . Die Regeldatei kann mehrere Regeln enthalten.

  • envVerwenden Sie zum Überprüfen aller verfügbaren Variablen Folgendes:

    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'"
    
  • Führen Sie Folgendes aus, um nach Parametern zu suchen, die für die Regelübereinstimmung verwendet werden sollen:

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

Verweise:

user.dz
quelle
2
Ich mag diesen Ansatz, Upvoting, Glückwunsch!
Frantique
2
+150: Tolle Antwort: (AFAIK besser als akzeptiert) Es ist eine allgemeine Regel für jedes USB-Gerät. In der akzeptierten Antwort ist der USB auf eine VID und eine PID beschränkt.
Helio
5

Sie können udeveinen beliebigen Befehl ausführen. Erstellen Sie eine Regel in /etc/udev/rules.d/:

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

Und geben Sie ein:

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

HINWEIS: Der XXXXund YYYYWerte werden von genommen werden lsusbausgegeben.

Frantique
quelle
Ich stimme nicht zu Das C ++ - Programm ist schließlich ein "Befehl". Der Benutzer fragt nach einer Lösung, um diesen Befehl auszulösen. (Er sagte: "Aber ich wollte, dass das Programm automatisch ausgeführt wird, wenn ein Flash-Laufwerk eingesetzt wird. Wie könnte ich das tun?")
Frantique
Was sind für diese [ ideone.com/uOReNj ] Ausgabe von lsusb die Werte von XXXXund YYYY?
Vinayawsm
Wenn Ihr Pendrive der Kingston ist, dann: XXXX = 0951 und YYYY = 162f.
Frantique
Sollte ich immer die Datei "my-usb-device.rules" aktualisieren, damit mein Code für jedes andere USB-Stick ausgelöst wird?
Vinayawsm
Sie müssen für jedes Gerät eine Regel erstellen. Oder überarbeiten Sie Ihren C ++ - Code besser, um ihn als Daemon auszuführen und die udev-Trigger zu beobachten.
Frantique