Russian Qt Forum
Ноябрь 22, 2024, 18:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мониторинг (hotplug) устройств в *.nix? [РЕШЕНО]  (Прочитано 10246 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Февраль 05, 2010, 08:57 »

Доброго всем дня!

Необходимо сделать "универсальный" класс для Qt4 , функцией которого было-бы слежение за наличием каких либо устройств в *.nix
т.е. при добавлении или удалении какого - либо устройства - класс должен об этом сигнализировать.

Я погуглил, но что-то не нашел простого универсального решения.

Но пока решил использовать для этой цели FAM (т.к. устройства в *.nix - это файлы, и поэтому это должно помочь). Но я не уверен что FAM  - это "универсальное" решение, т.к. не во всех дистрибутивах *.nix (включая встраиваемые решения) он может присутствовать.
Также есть HAL и D-BUS - но опять не факт что оно будет!!!
----

Посоветуйте плз, еще какие-нибудь решения.

ЗЫ: еще есть мысль про udev - но что-то не нашел примеров его использования программно. Грустный

----

Покопался в документации по Qt4 и набрел на класс QFileSystemWatcher ... Но он реализован как-то через "костыли", т.е. через QThread и тянет за собой кучу других классов... Грустный
« Последнее редактирование: Февраль 08, 2010, 18:42 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #1 : Февраль 05, 2010, 10:52 »

Такую вещь можно сделать и через udev/libudev, но он тоже не везде есть. В BusyBox есть легковесная замена mdev, а как его заставить сообщать приложению о добавлении устройств это уже интересная задача Улыбающийся (Не сложная, но интересная)

Посмотрел в QFileSystemWatcher. Может хотели чтобы чтение событий не тормозило GUI поток? Если для вас это не важно ну сделайте себе собственный нотификатор на inotify/QSocketNotifier.
« Последнее редактирование: Февраль 05, 2010, 11:02 от Rcus » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Февраль 05, 2010, 10:59 »

Цитировать
Такую вещь можно сделать и через udev/libudev, но он тоже не везде есть.
А не поделитесь ссылочками на примеры использования? Улыбающийся (гугл не помогает)
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #3 : Февраль 05, 2010, 13:30 »

Набросал небольшой пример по udev:
Код
C++ (Qt)
extern "C"
{
#include <libudev.h>
};
#include <iostream>
#include <assert.h>
 
using namespace std;
 
int main( int argc, char *argv[] )
{
   struct udev *lib = udev_new();
   assert( lib );
   struct udev_monitor *mon = udev_monitor_new_from_netlink( lib, "udev" );
   assert( mon );
 
   int err = udev_monitor_enable_receiving( mon );
   assert( !err );
 
// Получение дескриптора сокета.
// Его можно использовать например в QSocketNotifier для определения момента поступления данных от udev.
//    int sock = udev_monitor_get_fd( mon );
 
   for(;;)
   {
       // Чтение информации о устройстве, которое подключается/отключается.
struct udev_device *d = udev_monitor_receive_device( mon );
       // Для доступа с полям структуры udev_device есть специальные функции, вроде этой:
cout << udev_device_get_devpath( d ) <<  endl;
 
       // Для определения действия есть функция udev_device_get_action, которая возвращает строку "add" или "remove".
      // И т.д. :)
   }
 
   return 0;
}
 
« Последнее редактирование: Февраль 05, 2010, 13:35 от BRE » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Февраль 05, 2010, 13:45 »

Ухх.. Rcus , BRE - ОГРОМНОЕ спасибо!

Я наверное решу свою задачу с использованием udev!

Цитировать
// Его можно использовать например в QSocketNotifier для определения момента поступления данных от udev.
//    int sock = udev_monitor_get_fd( mon );

Дадада! Именно так я и задумывал делать!
----

ЗЫ: вроде бы всё пока понятно! СПС! Улыбающийся


Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Февраль 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-шном файле реализации методов класса написал:
Код:
...
extern "C"
{
#include <libudev.h>
};
...


Вопрос: как нужно правильно оформлять библиотеку, чтобы не ругалось Си-шные функции ?

Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #6 : Февраль 07, 2010, 18:30 »

А линковать с libudev не пробовали? Должно помогать.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Февраль 07, 2010, 18:38 »

Упс! Спасибо! Веселый
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Февраль 07, 2010, 18:51 »

Но все-равно непонятен один момент:
1. Создаю статическую библиотеку А, линкуя её с шаред-udev Б, при этом компиляция проходит без ошибок
2. Линкую свое проиложение с статической библиотекой А.. При компиляции компилятор говорит что не видит функций из библиотеки Б. Теперь, если при компиляции приложения еще добавить (прилинковать) библиотеку Б - то все без ошибок идет.

Почему при компиляции приложения компилятор требует библиотеку Б ? Так и должно быть? И что нужно сделать чтобы не требовал?
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 07, 2010, 19:27 »

Почему при компиляции приложения компилятор требует библиотеку Б ? Так и должно быть? И что нужно сделать чтобы не требовал?
Насколько я понял, компиляция у Вас проходит, что-то говорит только линкер.
Да, так быть должно. Компилятору нужны только описания ф-ций библиотеки (обычно заголовочные файлы). При создании статической библиотеки линкер также промолчит: нет каких-то ф-ций - ну и нет, статическая библиотека за это не отвечает. Но линкер не создаст приложение (исполняемый файл) если не обнаружена хотя бы 1 используемая ф-ция/переменная. Конечно все либы должны быть в наличии при линковке приложения.
Записан
andrew.k
Гость
« Ответ #10 : Июль 02, 2010, 11:46 »

А как можно отследить подключение USB-флешки. И чтобы в момент подключения понять, на какой порт и шину подключена, какому блочному устройству сопоставлена (какой мажорный/минорный номер)?
Без udev (его нет).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.203 секунд. Запросов: 22.