select

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

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

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

描述符集相关函数:

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

例子: 从STDIN_FILENO读

#include "apue.c"
#include <sys/select.h> int main(){
int ret, len;
fd_set set;
struct timeval time_out={5,0};
while(1){
FD_ZERO(&set);
FD_SET(STDIN_FILENO,&set);
time_out.tv_sec=5;
time_out.tv_usec=0; ret=select(1,&set,NULL,NULL,&time_out);
switch(ret){
case 0:
puts("time out, retry");
continue;
case -1:
err_quit("select err");
default:
if(FD_ISSET(STDIN_FILENO,&set)){
puts("STDIN_FILENO is available");
char buf[100]={0};
len=read(STDIN_FILENO,buf,100);
write(STDOUT_FILENO,buf,len);
}
}
}
return 0;
}

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

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

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表示不等待, 其它正值表示可等待的毫秒数

int poll(struct pollfd fdarray[], unsigned int nfds, int timeout);
struct pollfd{
int fd;
short events; //常用的读POLLIN/写POLLOUT
short revents; //可忽略设置
}
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/poll.h> int main(int argc, char *argv[]){
char buf[1024];
int fd;
int i;
struct pollfd pfds[2];
fd=open(argv[1],O_RDONLY); while(1){
pfds[0].fd=STDIN_FILENO;
pfds[0].events=POLLIN; pfds[1].fd=fd;
pfds[1].events=POLLIN; poll(pfds,2,-1);
if(pfds[0].revents & POLLIN){
i=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,i);
} if(pfds[1].revents & POLLIN){
i=read(fd,buf,10);
write(STDOUT_FILENO,buf,i);
}
}
}

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. IOS开发UI篇之自动滚动图片

    我们在做项目是有时候会遇到设置自动滚动图片,所以我自己也遇到过两次.觉得他是一个挺有意思东西,所以做了下总结 DEMO: .h #import <UIKit/UIKit.h> @inter ...

  2. ubuntu server 系统,更换阿里云源(用户更新源)

    Ubuntu安装完毕后,默认使用的是官方的源,在国内访问速度很慢,这里介绍更换为阿里云的源方法. 步骤如下: 1.备份源配置文件 sudo cp /etc/apt/sources.list /etc/ ...

  3. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  4. Linux apache日志分析常用命令汇总

    1.查看当天有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc –l 2.查看某一个页面被访问的次数: grep "/index.php&quo ...

  5. JQuery获取append后的动态元素

    在使用ajax请求后,使用jquery将数据append到网页中.发现jquery无法使用append内的id和class获取元素. 例如:$("ul").append(" ...

  6. Linux下向SVN服务器添加新文件步骤

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录)   例如:svn checkout svn://192.168.1.1/pro/domain    ...

  7. HDU1358:Period

    第一次做KMP.还没有理解透. 在自己写一遍时没有让next[0]初始化为-1. 还有就是next应该是c++中的关键字,提交后编译错误. From: http://blog.csdn.net/lib ...

  8. Part 1 some difference from asp.net to asp.net mvc4

    Part 1 some difference from asp.net to asp.net mvc4 In MVC URL's are mapped to controller Action Met ...

  9. Java之阶乘数的计算

    说起“阶乘数”,我们应该都不会感到陌生.当老师布置了这样的作业,我们大多数人是一贯用笔算,还有的同学会用计算机去计算.数学是讲究原理和方法的,我们知其然,也要知其所以然.下面我们就用编程来计算阶乘数. ...

  10. 浅谈sqlserver数据库优化(一)----开光篇

    今天暂时无事,风和日丽,万里无云.游山的.玩水的.遛麻雀的都闲的不亦乐乎,也忙的不亦乐乎.在这美好的季节,依旧躲在被窝或是电脑旁绞尽脑汁敲键盘的人们,也别有一番滋味.废话少说,言归正传. 赶上了一个最 ...