Ich habe ein C++-Programm, das auf USB-Sticks/Flash-Laufwerke zugreift. Es funktioniert für das aktuell eingelegte Flash-Laufwerk. Ein normales C++-Programm wird erst ausgeführt, wenn wir es ausführen. Aber ich wollte, dass das Programm automatisch ausgeführt wird, wenn ein Flash-Laufwerk eingesteckt wird. Wie kann ich das tun?
Akzeptierte Antwort:
Für den allgemeinen Gebrauch, wenn Sie Ihr Programm für einen beliebigen USB-Speicher ausführen möchten. Verwenden Sie den Treiber für den Regelabgleich.
-
Fügen Sie ein
udev
hinzu Regeldateisudo nano /etc/udev/rules.d/90-detect-storage.rules
-
Diese Regel hinzufügen
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
Wenn Sie möchten, dass Ihr Programm die Festplatten unterscheidet, damit es verschiedene Operationen ausführt, 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}"
-
Alle Regeln neu laden
sudo udevadm control --reload-rules
-
Trennen Sie das Flash-Laufwerk und schließen Sie es wieder an
Hinweise:
-
Ich habe diese Regel nur zum Testen verwendet, die ein Protokoll erstellt, wenn die Regel ausgelöst wird:
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
#
hinzufügen zum Zeilenanfang. Die Regeldatei kann mehrere Regeln enthalten. -
Um alle verfügbaren
env
zu überprüfen Variablen, verwenden Sie: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'"
-
Um nach Parametern zu suchen, die für die Regelübereinstimmung verwendet werden sollen, führen Sie Folgendes aus:
sudo udevadm info --name=/dev/sdb1 --attribute-walk
Referenzen:
- Übergeben Sie ATTR{idVendor} als Argument im udev-Skript
- Udev-Regeln schreiben von Daniel Drake