linux系統下網路模型數select最為常用,當然,select只是檢測檔案系統資料狀態,並不只侷限於網路程式設計,select的功能需要底層驅動提供支援,其中核心應用即為等待佇列,其他模型,如poll和epoll,對驅動來說並無區別,驅動只是返回資料狀態而已。驅動支援select,需要實現file_operations結構中的poll函式指標,其實現也非常簡單,只是poll_wait函式的呼叫,原型如下:
unsigned int (*poll) (struct file *, struct poll_table_struct *);void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table * wait);
驅動程式poll實現方法:
unsigned int (*poll)(struct file *filp,poll_table *wait)
1、使用poll_wait將等待佇列新增到poll_table中
2、返回描述裝置是否可讀或可寫的掩碼
位掩碼:
pollin 裝置可讀
pollrdnorm 資料可讀
pollout 裝置可寫
pollwrnorm 資料可寫
裝置可讀通常返回(pollin|pollrdnorm)
裝置可寫通常返回(pollout|pollwrnonrm
需要注意的是poll_wait函式不會像它名字一樣處於wait狀態,僅供上層查詢之用。其程式設計基本框架也比較固定,現修改******等待佇列驅動之中如下:
unsigned int ******_poll (struct file * filp, struct poll_table_struct * wait)
return mask;
}#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
dev_t devno;
struct class * ******_class;
static struct cdev cdev;
wait_queue_head_t ******_queue;
char test_data[255];
int len = 0;
unsigned int ******_poll (struct file * filp, struct poll_table_struct * wait)
return mask;
}ssize_t ******_read(struct file * pfile,
char __user * buf, size_t size, loff_t * ppos)
ssize_t ******_write(struct file * pfile, const char __user * buf, size_t count, loff_t * ppos)
if (!copy_from_user(test_data, buf, count))
return len;
}int ******_open(struct inode * pnode, struct file * pfile)
int ******_release(struct inode * pnode, struct file * pfile)
static struct file_operations ******_op =
;static int __init initialization(void)
static void __exit cleanup(void)
module_init(initialization);
module_exit(cleanup);
module_author("alloc [email protected]");
module_description("a ****** linux kernel module");
module_version("v0.1");
module_license("dual bsd/gpl");
linux字元裝置驅動 poll機制筆記
一 開發環境 1 核心 linux 2.6.22.6 2 jz2440 3 ubuntu 9.10 二 poll增加過程 poll就是監控檔案是否可讀的一種機制,作用與select一樣。應用程式的呼叫函式如下 int poll struct pollfd fds,nfds t nfds,int ti...
poll函式 Linux驅動基石之POLL機制
在前面引入中斷時,我們曾經舉過乙個例子 媽媽怎麼知道臥室裡小孩醒了?時不時進房間看一下 查詢方式 簡單,但是累 進去房間陪小孩一起睡覺,小孩醒了會吵醒她 休眠 喚醒 不累,但是媽媽幹不了活了 媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘 poll方式 要浪費點時間,但是可以繼續幹活。媽媽要麼是被小...
Linux裝置輪詢機制分析
所謂的裝置輪詢機制實際上就是利用網絡卡驅動程式提供的napi機制加快網絡卡處理資料報的速度,因為在大流量的網路環境當中,標準的網絡卡中斷加上逐層的資料拷貝和系統呼叫會占用大量的cpu資源,而真正用於處理這些資料的資源卻很少。乙個基本的想法是對於大流量網路,如果發現乙個dma傳輸中斷 這表明乙個網路資...