3.poll,select,epoll系统调用
允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或者写入(但是请注意select自身会阻塞进程知道某个描述符满足条件或者超时),常常用于那些要使用多个输入或者输出流而又不会阻塞于其中任何一个流的应用程序中,比如telnet程序,需要2个输出,2个输入流而又不希望阻塞。
上面三个系统调用均对应驱动程序中的poll方法,函数原型如下
- unsigned int (*poll)(struct file *filp,poll_table *wait);
该驱动方法一般分为两步:
1. 在一个或者多个可指示poll状态变化的等待队列上调用poll_wait.如果当时没有文件描述符可来执行I/O,则内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。
poll_wait原型:
void poll_wait(struct file *,wait_queue_head_t *,poll_table *);
2. 返回一个用来描述操作是否可以立即无阻塞执行的位掩码.
可读取返回POLLIN | POLLRDNORM;
可写入返回POLLOUT | POLLWRNORM;
使用非阻塞和阻塞操作的组合以及select方法可以有效地查询设备,但是对于某些情况却不是很适用,此时我们需要使用异步通知的方法。
阅读(1581) | 评论(0) | 转发(0) |