Cách thực hiện chương trình C ++ mỗi khi lắp ổ flash USB


9

Tôi có một chương trình C ++ truy cập ổ đĩa USB / ổ đĩa flash. Nó hoạt động cho ổ đĩa flash hiện đang chèn. Một chương trình C ++ bình thường không thực thi cho đến khi chúng tôi chạy nó. Nhưng tôi muốn chương trình chạy tự động mỗi khi ổ flash được lắp vào. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


7

Để sử dụng chung, Nếu bạn muốn chạy chương trình của mình cho bất kỳ bộ lưu trữ USB nào. Sử dụng trình điều khiển cho phù hợp với quy tắc.

  1. Thêm một udevtập tin quy tắc

    sudo nano /etc/udev/rules.d/90-detect-storage.rules
    
  2. Thêm quy tắc này

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

    Nếu bạn muốn chương trình của mình phân biệt các đĩa, để nó chạy các hoạt động khác nhau, hãy sử dụng (bạn có thể chuyển số sê-ri hoặc bất kỳ thuộc tính nào bạn muốn):

    ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
    
  3. Tải lại tất cả các quy tắc

    sudo udevadm control --reload-rules
    
  4. Rút phích cắm và cắm lại ổ đĩa flash

Ghi chú:

  • Tôi đã sử dụng quy tắc này chỉ để kiểm tra cái nào tạo ra nhật ký khi quy tắc được kích hoạt:

    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'"
    
  • Bạn có thể nhận xét các quy tắc bạn không muốn bằng cách thêm #vào đầu dòng. Tập tin quy tắc có thể chứa nhiều quy tắc.

  • Để kiểm tra tất cả các envbiến có sẵn , sử dụng:

    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'"
    
  • Để kiểm tra các tham số để sử dụng cho quy tắc khớp, hãy chạy:

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

Người giới thiệu:


2
Tôi thích cách tiếp cận này, nâng cao, chúc mừng!
Frantique

2
+150: Câu trả lời tuyệt vời: (AFAIK tốt hơn được chấp nhận) Nó tạo ra một quy tắc chung cho bất kỳ thiết bị USB nào. Trong câu trả lời bị đánh dấu, USB bị giới hạn ở VID và PID.
Helio

5

Bạn có thể sử dụng udevđể chạy một lệnh albitrary. Để làm cho nó hoạt động, tạo một quy tắc trong /etc/udev/rules.d/:

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

Và nhập:

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

LƯU Ý: Các giá trị XXXXYYYYsẽ được lấy từ lsusbđầu ra.


Tôi không đồng ý. Chương trình C ++ là một "lệnh" sau tất cả. Người dùng đang yêu cầu một giải pháp để kích hoạt lệnh đó. (Anh ấy nói: "Nhưng tôi muốn chương trình tự động chạy bất cứ khi nào ổ đĩa flash được lắp vào. Làm thế nào tôi có thể làm điều đó?")
Frantique

Đối với đầu ra [ ideone.com/uOReNj ] của lsusb, giá trị của XXXXvà là YYYYgì?
vinayawsm

Nếu ổ đĩa của bạn là Kingston hơn: XXXX = 0951 và YYYY = 162f.
Frantique

Để cho mã của tôi kích hoạt cho mọi ổ đĩa bút khác nhau, tôi có nên luôn cập nhật tệp "my-usb-device.rules" không?
vinayawsm

YOu phải tạo quy tắc cho mọi thiết bị. Hoặc tốt hơn là cấu trúc lại mã C ++ của bạn để chạy như daemon và quan sát các kích hoạt udev.
Frantique
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.