2011-12-27 122 views
2

在阻塞模式下,多個進程(而不是線程)可以輪詢設備描述符(例如:/ dev/xyx)並在驅動程序返回POLLIN時喚醒?在描述符上做輪詢的多個應用程序

詳細信息:我有一個驅動程序,並支持從驅動程序到用戶空間應用程序的異步事件通知,我在驅動程序中實現了輪詢功能。我期望多個進程在我的描述符/ dev/xyz上進行輪詢,在進行輪詢時,立即將驅動程序從.poll函數放入一個等待隊列,以便它們阻塞,直到驅動程序返回POLLIN。

現在,當一個進程在描述符上被阻塞時它可以正常工作,所以當驅動程序執行POLLIN時,poll()會取消阻塞並對其進行處理。但是,如果/ dev/xyz(通過執行輪詢)阻塞了多個進程,並且驅動程序發送了POLLIN,則只有其中一個進程解除阻塞,另一個進程仍然阻塞。

當驅動程序在/ dev/xyz上執行POLLIN時,是否有辦法確保在該描述符上阻塞的所有進程都被喚醒? (像走過等待隊列列表或什麼的)?

回答

0

您可以嘗試用wake_up_all(wake_up_interruptible_all)替換wake_up(或wake_up_interruptible)。這應該喚醒所有正在等待的進程。

+0

嗨,感謝您的回覆。我嘗試了wake_up_interruptible_all(),但我仍然看到阻塞的兩個進程中只有一個進入解鎖狀態。我的第二個過程對事件一無所知,並且它在poll系統調用中保持阻塞狀態。我正在進行輪詢(fd,1,-1)。我已經從驅動程序驗證了這兩個進程都放在了等待隊列中(使用printks)。任何更多的建議都比歡迎。謝謝 – Arav 2011-12-30 13:12:36

+0

我可以扔一些「也許」。也許這兩個進程不在同一個等待隊列中。也許醒來後,Linux再次調用輪詢處理程序,並再次進入睡眠狀態。也許你會在等待隊列和檢查是否有數據之間存在爭用條件(但這會解釋一致的行爲)。 – ugoren 2011-12-30 16:03:17