select

IO多路复用的设置方法与信号的屏蔽有点相似:

信号屏蔽需要先设定一个信号集, 初始化信号集, 添加需要屏蔽的信号, 然后用sigprocmask设置

IO多路转接需要先设定一个文件描述符集, 初始化描述符集, 添加感兴趣的描述符, 然后用select进行轮询检测哪些描述符已经可用

描述符集相关函数:

  1. fd_set //描述符集
  2. int FD_ZERO(fd_set*)// 清空fd_set
  3. int FD_SET(fd,fd_set*)// 将fd添加到fd_set中
  4. int FD_CLR(fd,fd_set*)// 从fd_set中删除fd
  5. int FD_ISSET(fd,fd_set*)// select返回后, 判断fd_set中的fd是否已经可用
  6. int select(int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *tvptr)
  7. maxfdp1: 最大文件符编号(fd)+1, 或直接用FD_SETSIZE
  8. readfds: 感兴趣的输入描述符集
  9. writefds: 感兴趣的输出描述符集
  10. exceptfds: 感兴趣的错误输出描述符集
  11. struct timeval{
  12. time_t tv_sec; //秒 long int
  13. suseconds_t tv_usec; //微秒 long int
  14. }
  15. select最后一个参数为NULL, 表示无限等待; 0时(timeval结构成员设置成0), 不等待; 不为0时(timeval指定值)时等待指定的时间后返回

例子: 从STDIN_FILENO读

  1. #include "apue.c"
  2. #include <sys/select.h>
  3. int main(){
  4. int ret, len;
  5. fd_set set;
  6. struct timeval time_out={5,0};
  7. while(1){
  8. FD_ZERO(&set);
  9. FD_SET(STDIN_FILENO,&set);
  10. time_out.tv_sec=5;
  11. time_out.tv_usec=0;
  12. ret=select(1,&set,NULL,NULL,&time_out);
  13. switch(ret){
  14. case 0:
  15. puts("time out, retry");
  16. continue;
  17. case -1:
  18. err_quit("select err");
  19. default:
  20. if(FD_ISSET(STDIN_FILENO,&set)){
  21. puts("STDIN_FILENO is available");
  22. char buf[100]={0};
  23. len=read(STDIN_FILENO,buf,100);
  24. write(STDOUT_FILENO,buf,len);
  25. }
  26. }
  27. }
  28. return 0;
  29. }

注意:select 返回后, 传入的fd_set和timeval会改变, 所以当重新调用select时要再次初始化fd_set和timeval

另外还有一个与select相似的函数叫pselect

  1. int pselect(int maxfd1, fd_set *readfds, fd_set *writefds, fd_set exceptfds, const struct timespec *tsptr, const sigset_t *sigmask)

与select不同的地方: pselect的等待时间设置结构为timespec, 且被调整为const, pselect还可以设置进程信号屏蔽

poll

与select作用相同, 实现不同

poll第一个参数是一个fd数组集合, 每个fd关联一个pollfd结构, 该结构说明fd的关心状态是读还是写

poll第二个参数是第一个参数中fd的个数

poll第三个参数是等待时间, -1表示无限等待, 0表示不等待, 其它正值表示可等待的毫秒数

  1. int poll(struct pollfd fdarray[], unsigned int nfds, int timeout);
  2. struct pollfd{
  3. int fd;
  4. short events; //常用的读POLLIN/写POLLOUT
  5. short revents; //可忽略设置
  6. }
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <sys/time.h>
  5. #include <sys/poll.h>
  6. int main(int argc, char *argv[]){
  7. char buf[1024];
  8. int fd;
  9. int i;
  10. struct pollfd pfds[2];
  11. fd=open(argv[1],O_RDONLY);
  12. while(1){
  13. pfds[0].fd=STDIN_FILENO;
  14. pfds[0].events=POLLIN;
  15. pfds[1].fd=fd;
  16. pfds[1].events=POLLIN;
  17. poll(pfds,2,-1);
  18. if(pfds[0].revents & POLLIN){
  19. i=read(STDIN_FILENO,buf,1024);
  20. write(STDOUT_FILENO,buf,i);
  21. }
  22. if(pfds[1].revents & POLLIN){
  23. i=read(fd,buf,10);
  24. write(STDOUT_FILENO,buf,i);
  25. }
  26. }
  27. }

IO多路转接select和poll的更多相关文章

  1. 网络通信 --> IO多路复用之select、poll、epoll详解

    IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视 ...

  2. 【python】-- IO多路复用(select、poll、epoll)介绍及实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  3. IO多路复用(select、poll、epoll)介绍及select、epoll的实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  4. I/O模型之二:Linux IO模式及 select、poll、epoll详解

    目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...

  5. Python——IO多路复用之select模块poll方法

    Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...

  6. IO多路复用之select、poll、epoll

    本文转载自IO多路复用之select.poll.epoll 导语 IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. ...

  7. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  8. 聊聊IO多路复用之select、poll、epoll详解

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436ef ...

  9. 以python理解Linux的IO多路复用,select、poll、epoll

    题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...

随机推荐

  1. HDU 4424 Conquer a New Region

    http://acm.hdu.edu.cn/showproblem.php?pid=4424 [题目大意] 给你N个点和N-1条边的连通图,也就是说任意两点间的路径是唯一的.每条边有个权值,从一点到另 ...

  2. centos6.5 iptables实现端口转发

    将本地接口IP 61.144.a.b 的3389端口 转发到 116.6.c.d的3389      (主要访问到61.144.a.b的3389端口,就会跳转到116.6.c.d的3389) [步骤] ...

  3. hdu 4081 最小生成树+树形dp

    思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...

  4. 转:http range 用法与说明

    转: http://www.cnblogs.com/Googler/archive/2010/08/19/1803700.html HTTP RANGE Range,是在 HTTP/1.1(http: ...

  5. 使用Gmail发送邮件心得

    /// <summary> /// 发送邮件 /// </summary> /// <returns></returns> public static ...

  6. ORACLE的分组统计之ROLLUP(一)

    Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现: 1. rollup,cube,grouping sets 扩展group by字句提供了丰富的 ...

  7. Java之奇偶组合

    写一个函数,将已知数组的奇数项组合成一个新的数组,在函数中调用该数组,并且输出新数组的内容. 定义一个数组,该数组为{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 ...

  8. rac安装oem

    [oracle@node1 ~]$ emca -config dbcontrol db -repos recreate -cluster STARTED EMCA at May 31, 2016 3: ...

  9. List.Select按字符串选择属性

    不知道大家有没有遇到这样的情况:List使用Lambda表达式的时候,想要选择项的某个属性列. 例如,选择编号ID: var idList=list.Select(o=>o.ID).ToList ...

  10. php面向对象的特性:OOP的继承

    1.关键字extends 2.PHP只支持单继承,不支持方法重载 /*使用protect 调用字段*/ class Computer{ //父类的字段 protected $_name="联 ...