當應用程式需要進行對多檔案讀寫時,常用到poll(system v)、select(bsd unix)、epoll(linux2.5.45開始)(沒驗證)系統呼叫配合使用。當poll函式返回時,會給出乙個檔案是否可讀寫的標誌,應用程式根據不同的標誌讀寫相應的檔案,實現阻塞或非阻塞的讀寫。這些系統呼叫功能相同: 允許程序來決定它是否可阻塞或非阻塞的讀寫乙個或多個檔案。這些呼叫都需要來自裝置驅動中poll 方法的支援,poll返回不同的標誌,告訴主程序檔案是否可以讀寫,其原型(定義在):
實現這個裝置方法分兩步:
1.使用poll_wait將等待佇列新增到poll_table中。
#include
static inline voidpoll_wait (structfile *filp, wait_queue_head_t *wait_address, poll_table *p);
增加wait_queue_head_t等待佇列到poll_tabl中。
2. 返回描述裝置是否可讀或可寫的掩碼。幾個標誌(通過定義)用來指示可能的操作:
標誌 含義
pollin
如果裝置無阻塞的讀,就返回該值(裝置可讀)
pollrdnorm
通常的資料已經準備好,可以讀了,就返回該值。通常的做法是會返回(polllin|pollrdnora)
(資料可讀)
pollrdband
如果可 以從裝置讀出帶外資料,就返回該值,它只可在linux內 核的某些網路**中使用,通常不用在裝置驅動程式中
pollpri
如果可 以無阻塞的讀取高優先順序(帶外)資料,就返回該值,返回該值會導致select報告檔案發生異常,以為select八帶外資料當作異常處理
pollhup
當讀設 備的程序到達檔案尾時,驅動程式必須返回該值,依照select的功能描述,呼叫select的程序被告知程序時可讀的。
pollerr
如果設 備發生錯誤,就返回該值。
pollout
如果裝置可以無阻塞地寫,就返回該值(裝置可寫)
pollwrnorm
裝置已經準備好,可以寫了,就返回該值。通常地做法是(pollout|pollnorm)
(資料可寫)
pollwrband
於pollrdband類似
裝置和資料在使用上實際上沒有任何差別,通常可讀返回:
pollin|pollrdnorm,可寫返回:pollout|pollwrnorm
應當重複一下 pollrdband 和 pollwrband 僅僅對關聯到 socket 的檔案描述符有意義: 通常裝置驅動不使用這些標誌。
poll 的描述使用了大量在實際使用中相對簡單的東西. 考慮 poll 方法的 scullpipe 實現:
static unsigned int scull_p_poll(struct file *filp, poll_table *wait)這個**簡單地增加了 2 個 scullpipe 等待佇列到 poll_table, 接著設定正確的掩碼位, 根據資料是否可以讀或寫.
所示的poll **缺乏檔案尾支援, 因為scullpipe 不支援檔案尾情況. 對大部分真實的裝置, poll 方法應當返回pollhup 如果沒有更多資料(或者將)可用. 如果呼叫者使用select 系統呼叫, 檔案被報告為可讀. 不管是使用poll 還是select, 應用程式知道它能夠呼叫 read 而不必永遠等待, 並且read 方法返回0 來指示檔案尾. 範例
static unsigned int mem_poll(struct file *filp,poll_table *wait)
poll方法只是做乙個登記,真正的阻塞發生在select.c中的do_select函式。
7 4 POLL裝置方法
系統呼叫 使用者空間 驅動 核心空間 open open close release read write ioctl ioctl lseek llseek select poll select系統呼叫 用於多路監控,當沒有乙個檔案滿足要求時,select將阻塞呼叫程序。int select max...
Linux 裝置驅動poll輪詢程式設計
linux系統下網路模型數select最為常用,當然,select只是檢測檔案系統資料狀態,並不只侷限於網路程式設計,select的功能需要底層驅動提供支援,其中核心應用即為等待佇列,其他模型,如poll和epoll,對驅動來說並無區別,驅動只是返回資料狀態而已。驅動支援select,需要實現fil...
Poll裝置操作(國嵌筆記)
poll裝置操作 使用者空間中的select對應核心中的poll 1.select系統呼叫用於多路監控,當沒有乙個檔案滿足要求時,select將阻塞呼叫程序。int select int maxfd,fd set readfds,fd set writefds,fe set exceptfds,co...