当应用程序调用 select 或 poll 函数来对驱动程序进行非阻塞访问的时候,驱动程序file_operations 操作集中的poll函数就会执行。 unsignedint(*poll)(structfile*filp,structpoll_table_struct*wait) wait:结构体 poll_table_struct 类型指针,由应用程序传递进来的。一般将此参数传递给poll_wait 函数。 返回值:向应用程...
typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); // 通用的poll_wait 函数, 文件的f_ops->poll 通常会调用此函数 static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p) { if (p && p->_q...
内核中,通过结构体poll_table_struct找到另一个结构体poll_table_page,上面的代码可以看出来,这个结构体是一个维护多个poll_table_entry结构体的内存页链表,poll_wait函数的参数就是传到poll_table_entry结构体中。 3.再看一下poll_table_entry里面的成员,第一个成员srutct file是poll_wait的第一个参数,第二个成...
好生阅读过代码就可以发现,do_select()函数中存在一个结构体struct poll_wqueues,其内嵌了一个poll_table的结构体,所以在后面的大循环中依次调用各个fd的fop->poll()传递的poll_table参数都是poll_wqueues.poll_table。 poll_table结构体的定义其实蛮简单,就一个函数指针,一个key值。这个函数指针在整个select过程...
2.1 主要数据结构: (1) struct poll_table_entry { struct file filp; wait_queue_t wait;//内部有一个指针指向一个进程 wait_queue_head_t wait_address;//等待队列头部(等待队列有多个wait_queue_t组成,通过双链表连接) }; (2) struct poll_table_page { ...
94 poll_wait(filp, &dev->read_queue, table); 95 96 if(dev->cur_size > 0) //设备可读 97 mask |= POLLIN; 98 99 P_DEBUG("***maks[%d]***\n", mask); 100 return mask; 101 } 102 103 struct file_operations test_fops = { ...
在poll方法中,通过poll_wait函数,驱动程序向poll_table_struct结构体中添加一个等待队列头,poll_wait函数的原型如下: voidpoll_wait(structfile*,wait_queuea_head_t*,poll_table*); 3. epoll驱动实例 我们基于之前scull_sleep设备进行修改,之前的设备是在读取过程中休眠,直到有数据写入且达到数据量要求后才唤醒读...
select()函数的接口主要是建立在一种叫fd_set结构体的基础上。这个结构体是一组文件描述符(fd)的集合。因为fd_set类型的长度在不同平台上是不同的,此应该用一组标准的宏定义来处理这个类变量。 我们来了解fd_set这个结构的定义: typedef struct {
// select/poll/epoll 向文件注册就绪后回调节点的接口结构 typedef struct poll_table_struct { // 向wait_queue_head 添加回调节点(wait_queue_t)的接口函数 poll_queue_proc _qproc; // 关注的事件掩码, 文件的实现利用此掩码将等待队列传递给_qproc ...