Linux内核中poll源码分析

函数原型:

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

其中pollfd类型的结构体包含三个元素。

  • fd:感兴趣的文件描述符
  • events:感兴趣的事件,包括可读、可写和异常
  • revents:实际发生的事件,由内核填充

几个重要的结构体:

struct pollfd {
   
	int fd;
	short events;
	short revents;
};

/* 
     * 每次select()都会初始化一个poll_wqueues结构与这个
     * 调用相对应。结构中的polling_task字段指向调用进程
     * (也就是current进程)的task_struct
     *
     * 资源等待队列节点wait_queue_t中的private字段指向
     * 对应的poll_wqueues对象。因此资源就绪时,通过获得
     * poll_wqueues对象,然后访问其中的polling_task字段
     * 能够得到调用进程的PCB,然后对其进行唤醒...
*/

struct poll_wqueues {
   
	poll_table pt;		//该结构体中存放一个函数指针
	struct poll_table_page *table;
	struct task_struct *polling_task;	 //保存当前调用进程的task_struct结构体
	int triggered;	
	int error;
	int inline_index;
	struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES];
};

typedef struct poll_table_struct {
   
	poll_queue_proc _qproc;
	unsigned long _key;
} poll_table;

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

/* 真正被挂载到资源等待队列中的结构 */
struct poll_table_entry {
   
	struct file *filp;		//设备的文件描述符
	unsigned long key;		//等待特定事件的掩码,如POLLIN、POLLOUT、POLLERR
	wait_queue_t wait;		//节点的private成员关联poll_table_entry所属的poll_wqueues
	wait_queue_head_t *wait_address;		//指向资源等待队列队列头
};

static inline void poll_wait(struct file * filp,ait_queue_head_t * wait_address,
	poll_table *p)
{
   	
	if (p && p->_qproc && wait_address)
		p->_qproc(filp, wait_address, p);
}

struct poll_table_page {
   
	struct poll_table_page * next;
 	struct poll_table_entry * entry;
 	struct poll_table_entry entries[0];
};

一些重要函数

/
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值