2012-12-05 45 views
2

我正試圖爲Linux實現一個字符設備驅動程序,並遇到了麻煩。簡而言之,寫入設備的數據被緩衝以供讀取。當沒有數據可用時,通過'wait_event_interruptible'讀取塊的調用。寫入處理程序收到的數據調用'wake_up_interruptible'。釋放處理程序還調用'wake_up_interruptible'來解鎖讀卡器,但設置一個標誌來指示驅動程序正在釋放。Linux設備驅動程序 - 如何在關閉文件時取消阻止讀取線程?

從用戶空間我有一個可執行文件,通過'打開'打開驅動程序,然後啓動另一個線程。主線程繼續調用'read'。按照預期,沒有數據可用於讀取和呼叫塊。另一個線程休眠一秒(爲主線程提供足夠的時間讀取和阻止),調用'close',然後再次調用'close'。第一次調用返回'0',而第二次調用返回'-1'(如預期)。然而,我的驅動程序的發佈處理程序從來沒有被調用,我不明白如何解鎖我的閱讀線程,而不明確發送信號或寫入一些數據到設備。我的理解是,當驅動程序的最後一個句柄關閉時,它的釋放處理程序被調用。我試圖實現我認爲是標準用戶空間行爲的內容 - 阻止從文件讀取的線程將被解除阻塞,並在異步關閉時接收文件結束返回值。

我對用戶空間中文件級別的讀/寫有正確的理解嗎?我有正確的設備驅動程序瞭解嗎?我錯過了別的嗎?我查看了「Linux設備驅動程序第三版」,無法找到這個問題的答案。我也搜索了谷歌,但似乎無法找到答案。任何幫助,你可以提供表示讚賞。我的內核版本是3.0.15。

+0

我會去了解一下插座碼獲取靈感。我*認爲*關閉套接字句柄使得在套接字上讀取和恢復返回0。 –

回答

1

不幸的是,讀取系統調用保持對文件本身的引用而不是文件描述符。因此關閉文件描述符不會中止讀取。

在任何情況下,你必須小心解鎖和關閉,你不想線程(或另一個)重新進入的系統調用之間的比賽條件;)

相關問題