函数原型:
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];
};
一些重要函数
/