Я написал драйвер устройства char и сейчас пишу «обертку» QT, которая должна получить сигнал на срабатывание, когда устройство станет читаемым с помощью механизма poll.Я пытался сделать:
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 никогда не вызывался, и мой драйвер никогда не сообщал, что вызывается его метод 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 () , кажется, указывает, что это должно быть.