Название: Мониторинг (hotplug) устройств в *.nix? [РЕШЕНО] Отправлено: kuzulis от Февраль 05, 2010, 08:57 Доброго всем дня!
Необходимо сделать "универсальный" класс для Qt4 , функцией которого было-бы слежение за наличием каких либо устройств в *.nix т.е. при добавлении или удалении какого - либо устройства - класс должен об этом сигнализировать. Я погуглил, но что-то не нашел простого универсального решения. Но пока решил использовать для этой цели FAM (т.к. устройства в *.nix - это файлы, и поэтому это должно помочь). Но я не уверен что FAM - это "универсальное" решение, т.к. не во всех дистрибутивах *.nix (включая встраиваемые решения) он может присутствовать. Также есть HAL и D-BUS - но опять не факт что оно будет!!! ---- Посоветуйте плз, еще какие-нибудь решения. ЗЫ: еще есть мысль про udev - но что-то не нашел примеров его использования программно. :( ---- Покопался в документации по Qt4 и набрел на класс QFileSystemWatcher ... Но он реализован как-то через "костыли", т.е. через QThread и тянет за собой кучу других классов... :( Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: Rcus от Февраль 05, 2010, 10:52 Такую вещь можно сделать и через udev/libudev, но он тоже не везде есть. В BusyBox есть легковесная замена mdev, а как его заставить сообщать приложению о добавлении устройств это уже интересная задача :) (Не сложная, но интересная)
Посмотрел в QFileSystemWatcher. Может хотели чтобы чтение событий не тормозило GUI поток? Если для вас это не важно ну сделайте себе собственный нотификатор на inotify/QSocketNotifier. Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: kuzulis от Февраль 05, 2010, 10:59 Цитировать Такую вещь можно сделать и через udev/libudev, но он тоже не везде есть. А не поделитесь ссылочками на примеры использования? :) (гугл не помогает)Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: BRE от Февраль 05, 2010, 13:30 Набросал небольшой пример по udev:
Код
Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: kuzulis от Февраль 05, 2010, 13:45 Ухх.. Rcus , BRE - ОГРОМНОЕ спасибо!
Я наверное решу свою задачу с использованием udev! Цитировать // Его можно использовать например в QSocketNotifier для определения момента поступления данных от udev. // int sock = udev_monitor_get_fd( mon ); Дадада! Именно так я и задумывал делать! ---- ЗЫ: вроде бы всё пока понятно! СПС! :) Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: kuzulis от Февраль 07, 2010, 16:58 Что-то не получается собрать проект.
Сделал шаред библиотеку в которой есть класс который использует udev. При компиляции библиотеки ошибок нет. Но при подключении этой библиотеки к приложению и компиляции приложения вылезают такие ошибки: Цитировать ../release/libqserialdevicewatcher.so: undefined reference to `udev_monitor_enable_receiving' ../release/libqserialdevicewatcher.so: undefined reference to `udev_monitor_get_fd' ../release/libqserialdevicewatcher.so: undefined reference to `udev_monitor_new_from_netlink' ../release/libqserialdevicewatcher.so: undefined reference to `udev_new' в *.cpp-шном файле реализации методов класса написал: Код: ... Вопрос: как нужно правильно оформлять библиотеку, чтобы не ругалось Си-шные функции ? Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: Rcus от Февраль 07, 2010, 18:30 А линковать с libudev не пробовали? Должно помогать.
Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: kuzulis от Февраль 07, 2010, 18:38 Упс! Спасибо! :D
Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: kuzulis от Февраль 07, 2010, 18:51 Но все-равно непонятен один момент:
1. Создаю статическую библиотеку А, линкуя её с шаред-udev Б, при этом компиляция проходит без ошибок 2. Линкую свое проиложение с статической библиотекой А.. При компиляции компилятор говорит что не видит функций из библиотеки Б. Теперь, если при компиляции приложения еще добавить (прилинковать) библиотеку Б - то все без ошибок идет. Почему при компиляции приложения компилятор требует библиотеку Б ? Так и должно быть? И что нужно сделать чтобы не требовал? Название: Re: Мониторинг (hotplug) устройств в *.nix? Отправлено: Igors от Февраль 07, 2010, 19:27 Почему при компиляции приложения компилятор требует библиотеку Б ? Так и должно быть? И что нужно сделать чтобы не требовал? Насколько я понял, компиляция у Вас проходит, что-то говорит только линкер. Да, так быть должно. Компилятору нужны только описания ф-ций библиотеки (обычно заголовочные файлы). При создании статической библиотеки линкер также промолчит: нет каких-то ф-ций - ну и нет, статическая библиотека за это не отвечает. Но линкер не создаст приложение (исполняемый файл) если не обнаружена хотя бы 1 используемая ф-ция/переменная. Конечно все либы должны быть в наличии при линковке приложения. Название: Re: Мониторинг (hotplug) устройств в *.nix? [РЕШЕНО] Отправлено: andrew.k от Июль 02, 2010, 11:46 А как можно отследить подключение USB-флешки. И чтобы в момент подключения понять, на какой порт и шину подключена, какому блочному устройству сопоставлена (какой мажорный/минорный номер)?
Без udev (его нет). |