我寫了一個字符設備驅動程序,現在正在編寫一個QT「包裝器」,其中的一部分是當設備通過輪詢機制可讀時觸發信號。我曾試圖做的事:使用QSocketNotifier在char設備上進行選擇。
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,我可以看到兩個人頭從我的驅動程序調用。一個用於初始民意調查註冊,另一個用於喚醒發生時的註冊。
這樣做我可能會產生一個單獨的線程,它所做的只是在這個設備上輪詢並拋出一個信號和循環。
以這種方式可以使用QSocketNotifier嗎? QFile::handle()的文檔似乎表明它應該是。
你有沒有得到這個工作看標準輸入?我寫了類似的東西,但是我不能'file-> read(buf,1)'來工作。它會掛起。然而,'read(file-> handle(),buf,1)'工作得很好。 – Harvey
@哈維是的,我檢查的答案爲我工作。原來是一個簡單的編碼錯誤。也檢查我的答案,看看它是否有幫助。 – jjcf89
爲了修改我以前的評論,這是我對設備驅動程序工作方式的一個誤解。這兩段代碼都起作用了,只是在我使用其中一個因素導致我進行錯誤連接時,其他因素導致整個測試失敗。 – Harvey