select 与 I/O多路转接
参考博客:http://blog.sina.com.cn/s/blog_607072980102uxcw.html
I/0多路转接:
描述符表示某个I/O。构造一张有关描述符的数据表,调用select函数,返回准备就绪的描述符,如果没有描述符准备好,则一直阻塞,超时返回0。
int select( int maxfdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, sturct timeval *tvptr);
返回:准备就绪的描述符,若超时则为0,若出错则为-1
maxfdp1为最大描述符值,设置为一个常数;
readfds、writefds、exceptfds是指向描述符集的指针,表示我们关心的可读、可写和处异常条件的描述符;
tvptr表示愿意等待的时间(秒、微秒),tvptr=NULL在捕捉到信号前永远等待。
描述符集
fd_set rset; //描述符集
int fd; //描述符集的位,表示一个描述符
FD_ZERO(fd_set *fdset); //清空fdset中的所有位
FD_SET(int fd, fd_set *fdset); //在fdset中打开fd所对应的位
FD_CLR(int fd, fd_set *fdset); //在fdset中关闭fd所对应的位
FD_ISSET(int fd, fd_set *fdset); //测试fd是否在fdset中
socket单线程并发程序select代码:
int main(int argc,char* argv[])
{
int ret,n;
int sockFd;
struct sockaddr_in servAddr;
fd_set oset,nset;
char strBuf[BUFSIZE];
//UDP地址绑定到服务器
if(argc!=)
errexit("USAGE:%s hostname port",argv[]);
sockFd=connectSock(argv[],argv[],"udp");
//初始化fd_set对象
FD_ZERO(&oset);
FD_SET(STDIN_FILENO,&oset);
FD_SET(sockFd,&oset);
nset=oset;
while()
{
ret=select(,&nset,NULL,NULL,);
if(FD_ISSET(sockFd,&nset))
{
memset(strBuf,,BUFSIZE);
recv(sockFd,strBuf,BUFSIZE,);
printf("%s",strBuf);
}
if(FD_ISSET(STDIN_FILENO,&nset))
{
fgets(strBuf,BUFSIZE,stdin);
send(sockFd,strBuf,sizeof(strBuf),);
memset(strBuf,,BUFSIZE);
}
nset=oset;
}
}
select 与 I/O多路转接的更多相关文章
- 高级I/O之I/O多路转接——pool、select
当从一个描述符读,然后又写到另一个描述符时,可以在下列形式的循环中使用阻塞I/O: ) if (write(STDOUT_FILENO, buf, n) != n) err_sys("wri ...
- IO多路转接select和poll
select IO多路复用的设置方法与信号的屏蔽有点相似: 信号屏蔽需要先设定一个信号集, 初始化信号集, 添加需要屏蔽的信号, 然后用sigprocmask设置 IO多路转接需要先设定一个文件描述符 ...
- Linux下I/O多路转接之select --fd_set
fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...
- UNIX环境高级编程——I/O多路转接(select、pselect和poll)
I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.pselect ...
- select函数与I/O多路转接
select函数与I/O多路转接 相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码: while( (n = read(socketfd, buf, BUFSIZE) ...
- 【Nginx】I/O多路转接之select、poll、epoll
当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或 ...
- I/O多路转接之select
系统提供select函数来实现多路复⽤用输入/输出模型.select系统调用是用来让我们的程序监视 多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或 多个发生了状 ...
- I/O多路转接 --- UNIX环境高级编程
I/O多路转接技术:先构造一张有关描述符的列表,然后调用一个函数,知道这些描述符中的一个已准备好进行I/O时,给函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.selec ...
- I/O多路转接模型
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
随机推荐
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- Vue框架(四)——路由跳转、路由传参、cookies、axios、跨域问题、element-ui模块
路由跳转 三种方式: $router.push / $router.go / router-link to this.$router.push('/course'); this.$router.pus ...
- JAVA知识点总结篇(一)
JVM(Java Virtual Machine):源文件->编译器->字节码文件->解释器->程序: JDK:Java Development Kit,Java开发工具包: ...
- windwos源码安装mysql
进入官网下载相关的mysql安装文件,解压到指定目录如E:\mysql-5.7.23-winx64下,然后进入该目录下新建data文件夹与my.ini文件,在my.ini文件中 [mysqld] po ...
- mysql5.7新增加用户和授权
迁移mysql数据库,运行项目的时候发现nginx和uWSGI都配置正确,可就是网站打不开,看了log文件,发现错误: django.db.utils.OperationalError: (1044, ...
- Maven的仓库和settings.xml配置文件
(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/83549846冷血之心的博客) 快速导航: Maven基础概念和安 ...
- 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI
原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...
- java之spring mvc之拦截器
1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2. 自定义实现一个拦截器的步骤: a). ...
- Java知识回顾 (18)Java 8、9、11的新特性
Java 8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 Jav ...
- 对于flex布局的使用心得
弹性盒子flex: 对于客户端的布局非常有用,不管是平均分配space-around这个属性还是两端对齐space-betwee在页面布局的时候都会有很好的表现. 对于部分内容区域中,具有很多大致内容 ...