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

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. 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 ...

  2. 端口被sysmtem占用

    今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示:

  3. Java EE启示录

    前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...

  4. Springer Latex投稿

    大家好.我最近需要向springer旗下一期刊投稿,是用latex编写的.已经调试过,格式和出版的期刊比较接近.因为是第一次投国外期刊,所以没什么经验,在网上搜索了一些帖子,发现在投稿过程中还会出现这 ...

  5. 本地测试ajax遇到的跨域问题

    浏览器console问题描述:Cross origin requests are only supported for protocol schemes: http, data, chrome, ch ...

  6. centOS7.4 thinkPHP nginx 支持pathinfo和rewrite

    server { listen 80; server_name www.demo.com mayifanx.com; root /data/www/demo; index index.php inde ...

  7. Eclipse和MyEclipse的区别

    翻译:日食,月食. eclipse是免费的,myeclipse是收费的. myeclipse是eclipse的插件.

  8. [Hadoop] - Hadoop 3.x版本新特性

    仅做记录--->官方说明:http://hadoop.apache.org/docs/r3.0.0-alpha2/index.html ============================= ...

  9. hdu 5974 A Simple Math Problem

    A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  10. css03层次选择器

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...