tl; dr:即使指定了超時,讀取文件描述符(指向procfs內核模塊)的選擇調用是否可以無限期地結束阻塞?可以選擇被內核模塊不間斷地阻塞嗎?
我正在嵌入式Linux系統中工作,我們有幾個內核模塊來管理對服務的訪問。一個這樣的模塊監視VLAN的狀態以進行更改。它將接口導出到/proc
下的目錄中。一個進程可以通過嘗試從在那裏創建的proc_file讀取來綁定通知到這個模塊。當發生變化時,模塊將在該接口上提供數據,並且調用者的讀取將隨信息一起返回。
這似乎是造成問題的原因,因爲內核模塊會阻止調用者使用內核信號量(struct semaphore)進行讀取。我認爲這導致呼叫者進入「D」或不間斷的阻塞狀態。這個過程不能被正確的終止,如果終止,它仍然不會被終止。它不僅不存在,而且也不釋放其資源。
我認爲這是一個「不這樣做」的情況,但我不是內核模塊的專家。看來更好的方法是在模塊中使用螺旋鎖或wait_event_interruptable。更改這些傳統的內核模塊是一件大事,所以我嘗試在讀取之前通過選擇FD來解決它。但是,這似乎也無限期阻止。
有沒有辦法糾正這種情況,而不改變內核模塊中使用的互斥?
如果您的模塊導致進程在select()調用時阻塞爲零超時,那麼它會被真正徹底地破壞。唯一的補救辦法是修復它。 –
@ n.m。 - 是的,它絕對好像被打破了。我認爲當產品遷移到嵌入式Linux時,很多這些內核模塊都是急速開發的。開發人員似乎並不瞭解阻止呼叫者的正確方法。謝謝! – agentchuck