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.现代操作系统中,线程数已经得到了 ...
随机推荐
- LeetCode——Find All Numbers Disappeared in an Array
LeetCode--Find All Numbers Disappeared in an Array Question Given an array of integers where 1 ≤ a[i ...
- 端口被sysmtem占用
今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示:
- Java EE启示录
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
- Springer Latex投稿
大家好.我最近需要向springer旗下一期刊投稿,是用latex编写的.已经调试过,格式和出版的期刊比较接近.因为是第一次投国外期刊,所以没什么经验,在网上搜索了一些帖子,发现在投稿过程中还会出现这 ...
- 本地测试ajax遇到的跨域问题
浏览器console问题描述:Cross origin requests are only supported for protocol schemes: http, data, chrome, ch ...
- centOS7.4 thinkPHP nginx 支持pathinfo和rewrite
server { listen 80; server_name www.demo.com mayifanx.com; root /data/www/demo; index index.php inde ...
- Eclipse和MyEclipse的区别
翻译:日食,月食. eclipse是免费的,myeclipse是收费的. myeclipse是eclipse的插件.
- [Hadoop] - Hadoop 3.x版本新特性
仅做记录--->官方说明:http://hadoop.apache.org/docs/r3.0.0-alpha2/index.html ============================= ...
- hdu 5974 A Simple Math Problem
A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- css03层次选择器
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...