C ++ / Qt Уведомление об изменении атрибута sysfs - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть встроенная система, для которой кто-то написал модуль ядра. Я ни в коем случае не новичок в написании модулей ядра, но из того, что я знаю из «документации» модуля и его грубого потока, я знаю, что он следит за прерыванием, которое он запросил с помощью request_irq, делает некоторые ошибки и устанавливает файл атрибута sysfs в соответствии с ним:

static ssize_t v_detect_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    /*
    struct platform_device *pdev = to_platform_device(dev);
    struct can_detection_config* config = platform_get_drvdata(pdev);
    */
    struct can_detection_config* config = dev_get_drvdata(dev);

    if (gpiod_get_value_cansleep(config->detect_gpio))
        strcpy(buf, "plugged\n");
    else
        strcpy(buf, "unplugged\n");

    return strlen(buf);
}
static DEVICE_ATTR_RO(v_detect);

Я знаю, что это каким-то образом заканчивается в файле /sys/bus/platform/devices/can-detect/v_detect, так что это атрибут sysfs. Мой вопрос заключается в том, как я могу отслеживать изменение состояния файла без опроса в моем приложении Qt / C ++. Я пытался использовать QFileSystemWatcher, но при выводе state v_detect до и после отключения дата изменения остается неизменной. Также попытался использовать QSocketNotifier для проверки изменений в дескрипторе файла: QSocketNotifier notifier(v_detect.handle(), QSocketNotifier::Read); Но эта вещь просто запускает без остановки и забивает мою очередь событий.

Любая идея о том, как этого добиться, очень оценили.

1 Ответ

0 голосов
/ 06 апреля 2020

Попробуйте изменить QSocketNotifier::Read на QSocketNotifier::Exception, а затем, когда сигнал будет излучен, выполнить readAll () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...