设备操作函数 3> poll

1960阅读 0评论2015-06-11 lsxuan驱动
分类:嵌入式

0> 目标:
                会用,忽略原理,,,
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1> 用户态: #include
poll:把线性的阻塞,变成并行的阻塞,防止了1个被阻塞,全都阻塞状况。
read1()

read2()

read3()

read1()      read2()       read3()


 struct pollfd {
               int   fd;         /* 文件描述符*/
               short events;     /* 对该文件描述符要监听的事件类型 , 例如POLLIN是对该fd读的阻塞*/
               short revents;    /* 该文件描述符发生的事件,由内核poll函数返回值填充*/
 };

int poll (
                        struct pollfd *fds,   //要监听多个文件描述符,需要结构体数组->数组名。
                        nfds_t nfds,           //文件描述符个数
                         int timeout           // [>0等待的毫秒]    [<0无限超时] [=0指示poll调用立即返回并列出准备好I/O的文件描述符]
);

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
使用框架:
     app.txt


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2> 内核态:
/*用户态poll select epoll都调的是这个函数。*/

unsigned int poll(struct file *filp,  struct_table_struct * wait)   //思路:我们用等待队列实现了阻塞, 那么把每个等待队列放一排,就实现了整体监听
{
    void poll_wait(struct file * filp,
                                wait_queue_head_t * wait_address,   //等待队列地址
                                poll_table *p   //wait: 等待队列放到此
        );          //用户态调用poll, 就阻塞到这。

    if(用户态监听事件发生){
            return make;  //返回监听对应事件编码;
    }

}

poll.txt









上一篇:设备操作函数 2> ioctl
下一篇:编译错误