POLL機制的理解

2021-07-30 03:04:51 字數 2541 閱讀 6098

1、poll存在於核心空間,對應於使用者空間的select。

有很多用系統呼叫(使用者空間)對應到驅動(核心空間)的函式:

系統呼叫(使用者空間)              驅動(核心空間)

open                                              open

close                                              release

read                                              read

write                                            write

ioctl                                               ioctl

lseek                                              llseek

select/poll                                      

poll

2、poll

裝置方法的作用

① 使用poll_wait將等待佇列新增到poll_table中。

②返回描述裝置是否可讀或可寫的掩碼 mask。

pollin

裝置可讀

pollrdnorm

資料可讀

pollout

裝置可寫

pollwrnorm

資料可寫

裝置可讀通常返回

(pollin|pollrdnorm )

裝置可寫通常返回

(pollout|pollwrnorm )

3. 等待事件的發生

wait_event(wq,condition) 

#definewait_event_interruptible(wq, condition) \

wq : 是要去等的等待佇列 

condition : a c expression for the event to wait for

如果condition 表達為假 ,wait_event 會進入睡眠 ,等待被喚醒(被wake_up喚醒)

4. 喚醒佇列wake_up(q)

q: 喚醒等待佇列 ,等待佇列結構體指標

#define wake_up(x) __wake_up(x, task_normal, 1, null)

5、define declare_wait_queue_head(name) \ 

wait_queue_head_t name = __wait_queue_head_initializer(name) 

根據傳入的字串name,建立乙個名為name的等待佇列頭

1. 應用程式中呼叫select查詢指定檔案是否可讀、可寫或異常

2. 系統會呼叫驅動中的poll函式(file_operations中的),查詢指定檔案是否可讀、可寫

3. poll返回檔案否可讀、可寫

4. 如果應用程式呼叫select時,沒有加超時,這時系統會呼叫wait_event_interruptible,

根據select監控的檔案描述符集,來確定都等待佇列還是寫等待佇列上等待,讀寫任何乙個條件成立,

當前程序都會被從等待佇列上摘除。

如果應用程式呼叫select時,有加超時, 這時系統會呼叫wait_event_interruptible_timeout

5. 如果wait_event_timeout超時,系統會再次呼叫驅動中的poll函式確認指定檔案是否可讀、可寫或異常狀態 

如果有別的程序呼叫wake_up_interruptible(如果是讀等待佇列,這個函式在驅動write函式中呼叫,

如果是寫等待佇列,這個函式在驅動read函式中呼叫),

系統會再次呼叫驅動中的poll函式確認指定檔案是否可讀、可寫或異常狀態

7. select系統呼叫返回

poll()函式:這個函式是某些unix系統提供的用於執行與select()函式同等功能的函式,下面是這個函式的宣告:

#include

int poll(struct pollfd fds, nfds_t nfds, int timeout);

引數說明:

fds:是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符;每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便;特別是對於 socket連線比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函式不同,呼叫select()函式之後,select() 函式會清空它所檢測的socket描述符集合,導致每次呼叫select()之前都必須把socket描述符重新加入到待檢測的集合中;因 此,select()函式適合於只檢測乙個socket描述符的情況,而poll()函式適合於大量socket描述符的情況;

按鍵驅動 poll機制

應用程式 open,read,write,poll 驅動程式 open,read,write,poll 所有的系統呼叫,基於都可以在它的名字前加上 sys 字首,這就是它在核心中對應的函式。比如系統呼叫open read write poll,與之對應的核心函式為 sys open sys read...

linux的poll的工作機制

poll的作用 同時探測n個drivers,找到可以直接使用的driver,從而盡量block程序。以下kernel源 來自於 與 fs select.c static unsigned int scull p poll struct file filp,poll table wait poll呼叫...

驅動中的poll機制分析

核心 sys poll struct pollfd ufds,unsigned int nfds,long timeout mesecs do sys poll ufds,nfds,to poll initwait table 初始化乙個poll wqueues 變數table init poll ...