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