使用QSocketNotifier对字符设备进行选择

Using QSocketNotifier to select on a char device.

本文关键字:行选 选择 QSocketNotifier 字符 使用      更新时间:2023-10-16

我写了一个char设备驱动程序,现在正在写一个QT"包装器",其中一部分是在设备通过轮询机制变得可读时获得一个信号。我曾经尝试过:

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
  QSocketNotifier sn(file.handle(), , QSocketNotifier::Read);
  sn.setEnabled(true);
  connect(&sn, SIGNAL(activated(int)), &this, SLOT(readyRead()));
}

但是readyRead从来没有被调用过,我的driver也从来没有报告它的poll方法被调用过。

我能够让下面的代码工作,所以我知道我的驱动程序正在工作

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
    struct pollfd fd;
    fd.fd = file.handle();
    fd.events = POLLIN;
    struct pollfd fds[] = {fd};
    int ready;
    qDebug() << "Started poll";
    ready = poll(fds, 1, -1);
    qDebug() << "Poll returned: " << ready;
    QTextStream in(&file);
    QTextStream out(stdout);
    out << in.readAll();
}

这适当地等待我的驱动程序调用wake_up,我可以看到我的驱动程序的两个轮询调用。一个用于初始轮询注册,另一个用于wake_up发生时。

这样做,我可能不得不生成一个单独的线程,它所做的就是在这个设备上轮询,并抛出一个信号和循环。

是否可以这样使用QSocketNotifier ?QFile::handle()的文档似乎表明它应该是。

我还将提到QSocketNotifier可以使用以下命令来监视stdin

#include "ConsoleReader.h"
#include <QTextStream>
#include <unistd.h> //Provides STDIN_FILENO
ConsoleReader::ConsoleReader(QObject *parent) :
    QObject(parent),
    notifier(STDIN_FILENO, QSocketNotifier::Read)
{
    connect(&notifier, SIGNAL(activated(int)), this, SLOT(text()));
}
void ConsoleReader::text()
{
    QTextStream qin(stdin);
    QString line = qin.readLine();
    emit textReceived(line);
}

——头

#pragma once
#include <QObject>
#include <QSocketNotifier>
class ConsoleReader : public QObject
{
    Q_OBJECT
public:
    explicit ConsoleReader(QObject *parent = 0);
signals:
    void textReceived(QString message);
public slots:
    void text();
private:
    QSocketNotifier notifier;
};

一旦if块结束,您的QSocketNotifer就会被破坏。它不可能报告任何东西。

只要您希望监视该文件,就必须使该套接字通知程序保持活动状态。最简单的方法可能是在你的一个类中保留一个QSocketNotifer*成员。