多路复用都是在阻塞模式下有效!

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的更多相关文章

  1. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  2. (转)Linux下select, poll和epoll IO模型的详解

    Linux下select, poll和epoll IO模型的详解 原文:http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll ...

  3. 【操作系统】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 多路复 ...

  4. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  5. Linux下select, poll和epoll IO模型的详解

    http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...

  6. I/O多路复用 select poll epoll

    I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...

  7. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

  8. Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程

    1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...

  9. I/O多路复用select/poll/epoll

    前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...

随机推荐

  1. Python caffe.TEST Example(Demo)

    下面提供了caffe python的六个测试demo,大家可以根据自己的需求进行修改. Example 1 From project FaceDetection_CNN-master, under d ...

  2. java关键词整理——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/5e27f174483042

  3. Java 获取路径的几种方法 - 转载

    1.获取当前类所在的“项目名路径” String rootPath = System.getProperty("user.dir"); 2.获取编译文件“jar包路径”(反射) S ...

  4. 转 : Java的版本特性与历史

    Java Versions, Features and History This article gives you a highlight of important features added i ...

  5. Android -- ContentProvider 内容提供者,创建和调用

    1. 概述 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentPr ...

  6. NumPy排序、搜索和计数函数

    NumPy - 排序.搜索和计数函数 NumPy中提供了各种排序相关功能. 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性. 下表显示了三种 ...

  7. Spring中Bean的生命周期是怎样的

    1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3.如果Bean实现了BeanNameAware接口,Sprin ...

  8. npm和git代理

    npm 删除代理设置:npm config delete proxynpm config delete https-proxynpm 设置代理:npm config set proxy http:// ...

  9. selenium学习笔记(简单的元素定位)

    收拾一下心情开始新的一周工作 继续是selenium的学习.配置成功后 由于所有操作都是建立在页面元素基础上的.所以下来就是学习定位元素 首先是基础的定位.就使用博客园首页搜索框为例: 下面是代码: ...

  10. 在linux上用jmeter压测时出现很多异常java.net.NoRouteToHostException: Cannot assign requested address.

    今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 经网上查资料, 是由 ...