会用,忽略原理,,,
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