linux的poll的工作機制

2021-06-25 23:41:44 字數 1791 閱讀 6898

poll的作用:同時探測n個drivers,找到可以直接使用的driver,從而盡量block程序。

以下kernel源**來自於:

與 fs/select.c

static unsigned int scull_p_poll(struct file *filp, poll_table *wait)

poll呼叫之後,

kernel針對每個driver進入其相應的poll函式

。poll_wait負責將當前程序放入wait_queue,(

對於每個driver,每個queue,申請wait_queue_t, 放入相應的queue,由kernel完成)

,但是現在並不阻塞current程序,直到所有的driver最後都沒有合適的mask的時候,阻塞poll系統呼叫,

當有訊號將當前程序喚醒後,說明某一條件滿足了。阻塞結束,返回將current從wait_queue挪出來

。具體poll系統呼叫的內部資料結構為:

struct poll_wqueues;

//每乙個poll系統呼叫只有乙個poll_wqueues。是總的結構。

//但是對外介面是poll_table pt的位址。進入此模組後,使用container_of求出poll_wqueues的位址。絕對,物件導向的用法。

減少了耦合性。

上面poll_table的的資料結構。

typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);

typedef struct poll_table_struct poll_table;

//poll_table的變數是乙個函式指標,先不用管。

然後poll_table_page, poll_table_entry.

struct poll_table_entry ;

struct poll_table_page ;

#define poll_table_full(table) \

((unsigned long)((table)->entry+1) > page_size + (unsigned long)(table))

具體poll的資料結構的示意圖。

struct poll_wqueues ---> struct poll_table_page // poll_wqueues指向乙個poll_table_page的單鏈表,每乙個page佔1個page_size大小的區域。

struct poll_table_page ---> struct poll_table_entry // 每個poll_table_page在申請的乙個page_size的頭,entry的空間都在剩下的空間中。

請看poll_wait是怎麼操作poll的資料結構的。

void __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *_p)

new_table->entry = new_table->entries;

new_table->next = table;

p->table = new_table;

table = new_table;

}/* add a new entry */

}

POLL機制的理解

1 poll存在於核心空間,對應於使用者空間的select。有很多用系統呼叫 使用者空間 對應到驅動 核心空間 的函式 系統呼叫 使用者空間 驅動 核心空間 open open close release read read write write ioctl ioctl lseek llseek ...

Linux驅動之poll機制

驅動程式 include 模組有關的 include 核心有關的 include 檔案系統有關的 include include include include include include linux中斷 include include include include copy to user ...

linux驅動編寫之poll機制

1.poll情景描述 以按鍵驅動為例進行說明,用阻塞的方式開啟按鍵驅動檔案 dev buttons,應用程式使用read 函式來讀取按鍵的鍵值。這樣做的效果是 如果有按鍵按下 了,呼叫該read 函式的程序,就成功讀取到資料,應用程式得到繼續執行 倘 若沒有按鍵按下,則要一直處於休眠狀態,等待這有按...