Linux 多路复用 select / poll
多路复用都是在阻塞模式下有效!
linux中的系统调用函数默认都是阻塞模式,例如应用层读不到驱动层的数据时,就会阻塞等待,直到有数据可读为止。
问题:在一个进程中,同时打开了两个或者两个以上的文件,读第一个文件时没有数据阻塞了。程序就停止在此位置等待,可是第二个文件有数据可读了,数据读不到怎么办?
回答:此种问题可以用多路复用 select / poll 完美解决。
多路复用 select / poll :对多个文件描述符进行监控,一旦有文件描述符可读或者可写,就会通知应用程序进行读写。
1、select
// 监控多个文件描述符属性变化,包括可读,可写,出错异常
// 参数1:监控的最大描述符加1
// 参数2:监控的可读描述符集合
// 参数3:监控的可写描述符集合
// 参数4:监控的出错异常描述符集合
// 参数5:监控时间 NULL-永远等待 0-不阻塞 固定时间
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
// 检查指定的文件描述符是否可读写
int FD_ISSET(int fd, fd_set *set);
// 将一个文件描述符加入到监控集合中
void FD_SET(int fd, fd_set *set);
// 将指定文件描述符从集合中删除
void FD_CLR(int fd, fd_set *set);
// 清空集合
void FD_ZERO(fd_set *set);
2、poll
struct pollfd {
int fd; /* 监控的文件描述符 */
short events; /* 等待的事件 */
short revents; /* 发生的事件 */
};
// 监控多个文件描述符的属性变化
// 参数1:文件描述符集合
// 参数2:文件描述符数量
// 参数3:超时时间
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
POLLIN:可读
POLLOUT:可写
POLLERR:出错
------------------------
应用:实现一个poll的接口:
struct pollfd pfd[2]; pfd[0].fd = fd;
pfd[0].events = POLLIN; // 0为标准输入
pfd[1].fd = 0;
pfd[1].events = POLLIN; ret = poll(pfd, 2, -1);
if(ret > 0)
{
// 查询
if(pfd[0].revents & POLLIN)
ret = read(fd, &event, sizeof(struct key_event)); if(pfd[1].revents & POLLIN)
fgets(kbd_buf, 64, stdin);
}
------------------------
驱动:实现一个poll的接口:
unsigned int key_drv_poll(struct file *filp, struct poll_table_struct *pts)
{
// 如果没有数据返回一个0, 有数据返回一个POLLIN
unsigned int mask = 0; //将当前的等待队列头,注册到vfs层
//参数1--文件对象
//参数2--等待队列头
//参数3--当前函数第二参数
poll_wait(filp, &key_dev->wq_head, pts); if(key_dev->have_data)
mask |= POLLIN; return mask;
}
Linux 多路复用 select / poll的更多相关文章
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- (转)Linux下select, poll和epoll IO模型的详解
Linux下select, poll和epoll IO模型的详解 原文:http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll ...
- 【操作系统】I/O多路复用 select poll epoll
@ 目录 I/O模式 I/O多路复用 select poll epoll 事件触发模式 I/O模式 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O I/O多路复用 I/O 多路复 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Linux下select, poll和epoll IO模型的详解
http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...
- I/O多路复用 select poll epoll
I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- I/O多路复用select/poll/epoll
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...
随机推荐
- ZC_异常
1. “Exception in thread "main" java.lang.UnsatisfiedLinkError: no JniVC6 in java.library.p ...
- TiDB 在摩拜单车的深度实践及应用
一.业务场景 摩拜单车 2017 年开始将 TiDB 尝试应用到实际业务当中,根据业务的不断发展,TiDB 版本快速迭代,我们将 TiDB 在摩拜单车的使用场景逐渐分为了三个等级: P0 级核心业务: ...
- DOM元素的位置、尺寸及更多的信息
一.基本概念 document.documentElement是整个DOM树的根节点,对应的元素就是html.下面将其称作根元素或根节点. document.body,对应的元素是body 二.浏览器 ...
- django1.9的static文件配置
修改setting.py,后面加入 STATIC_URL = '/static/' 上面那句是写死的,让django能调用静态文件,下面这句是配置静态文件的路径,路径可以填写多个,用逗号隔开 STAT ...
- JSP静态包含和动态包含的区别和联系
JSP页面的静态包含和动态包含 JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含: <jsp:include page= ...
- datagrid中用tooltip
function msgFormat(value,row){ value = value.replace(/ /g," "); return '<span title='+ ...
- sed、awk学习篇
[yongsan@yz6245 ~]$ awk 'BEGIN {FS=":"}{shells[$NF]++;}END{for(i in shells)print i ": ...
- Openstack Mitaka 负载均衡 LoadBalancerv2
最近研究了一下Openstack负载均衡,yum源和源码级别的安装都尝试成功了.网上有很多文章都是LoadBalancerv1,这个已经被放弃了.所以写一下自己是如何使用LoadBalancerv ...
- Linux各文件及目录说明2018-03-01更新
本人wechat:YWNlODAyMzU5MTEzMTQ=. *** /etc /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/clo ...
- DRF 中 解决跨域 与 预检
DRF 中 解决跨域 与 预检 1 跨域 浏览器的同源策略: 对ajax请求进行阻拦 ps: 对href src属性 不限制 只有浏览器会阻止,requests模块不会存在跨域 (1)解决方案1 JS ...