Linux驅動程式之poll機制

2021-07-02 11:35:12 字數 1218 閱讀 4000

使用非阻塞i/o的應用程式通常會使用select()和poll()系統呼叫查詢是否可對裝置進行無阻塞的訪問,這兩個系統呼叫最終又會引發裝置驅動中的poll()函式被執行

,所以我們的問題就集中到了如何編寫裝置驅動中的poll()函式就可以了。

先來看看裝置驅動中的poll()函式原型:

這個函式要進行下面兩項工作:

首先,對可能引起裝置檔案狀態變化的等待佇列呼叫poll_wait(),將對應的等待佇列頭新增到poll_table.

然後,返回表示是否能對裝置進行無阻塞讀寫訪問的掩碼。

在上面提到了乙個poll_wait()函式,它的原型:

void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait);

它的作用就是把當前程序新增到wait引數指定的等待列表(poll_table)中。需要注意的是這個函式是不會引起阻塞的。poll_table

定義在「

include/linux/poll.h, line 38

「,具體如下:

typedef struct poll_table_struct 

poll_table;

經過以上驅動程式的poll()函式應該返回裝置資源的可獲取狀態:pollin, pollout, pollpri, pollerr, pollnval等巨集的位"或"結果。每個巨集的含義都表示裝置的一種狀態,如:

常量說明

pollin

普通或優先順序帶資料可讀

pollrdnorm

普通資料可讀

pollrdband

優先順序帶資料可讀

pollpri

高優先順序資料可讀

pollout

普通資料可寫

pollwrnorm

普通資料可寫

pollwrband

優先順序帶資料可寫

pollerr

發生錯誤

pollhup

發生掛起

pollnval

描述字不是乙個開啟的檔案

poll驅動程式示例

1 驅動 include include include include include include include include include define queue count 256 int readqcount 0 int readqhead 0 int readqtail 0 c...

字元裝置驅動程式之按鍵 poll機制

本節裡我們在按鍵中斷機制的基礎上新增了poll機制來優化程式 我們知道,應用程式中的open read write函式會呼叫核心裡的sys open sys read sys write函式,而核心裡的這些函式又會對應到驅動程式裡的.open read write函式。我們的poll機制也不例外,使...

linux驅動程式中的poll機制程式設計

include include include include include include include include include include include 載入模式後,執行 cat proc devices 命令看到的裝置名稱 define device name key pol...