select函数的使用
2024-09-04 00:49:43
select函数是 I/O 复用中非常重要的一个函数,属于并发编程的。它能够监视我们需要监视的文件描述符的变化情况–读、写或者异常
1. 函数原型
#include <sys/select.h> int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set*errorfds,struct timeval *timeout
select将文件描述符放入一个集合,成为文件描述符集fd_set
2. 参数
1. maxfdp是一个整数值,集合中文件描述符的范围,所有文件描述符最大值 + 1
2. fd_set *readfds。读文件描述符集,关心文件描述符的读变化
3. fd_set *writefds。写文件描述符集,关心文件描述符的写变化
4. fd_set *errorfds。监视文件错误异常
5. struct timeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态。
第一:NULL,即不传入时间结构,就是将select至于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变换为止;
第二:0秒0毫秒,就变成了一个纯粹的非阻塞函数,不管文件描述符有无变化,立刻返回。无变化返回0, 有变化返回一个正值
第三:timeout的值大于0,select在timeout时间内阻塞,超时时间之内有事件到来就返回,否则立即返回,返回值同第二条
3. 返回值
负值:select错误
正值:某些文件可读、可写或者出错
0:等待超时,没有可读、可写或者出错的文件
4. 相关宏
FD_CLR(inr fd,fd_set* set); 用来清除描述词组set中相关fd的位 FD_ISSET(int fd,fd_set *set); 用来测试描述词组set中相关fd的位是否为真 FD_SET(int fd,fd_set*set); 用来设置描述词组set中相关fd的位 FD_ZERO(fd_set *set); 用来清除描述词组set的全部位
struct timeval代表时间值,一个是秒数、另一个微妙
#include <sys/time.h>
struct timeval
{
time_t tv_sec; //seconds 秒
time_t tv_usec; //microseconds 微秒,1000000 微秒 = 1秒
};
5. select_example.cpp
Linux下监控键盘上是否有数据到来
#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h> #include <unistd.h>
#include <iostream> using namespace std; int main()
{
int keyboard;
int ret,i;
char c;
fd_set readfd;
struct timeval timeout; keyboard = open("/dev/tty",O_RDONLY | O_NONBLOCK);
assert(keyboard > ); while ()
{
timeout.tv_sec = ;
timeout.tv_usec = ;
FD_ZERO(&readfd);
FD_SET(keyboard,&readfd); ret = select(keyboard + , &readfd, NULL, NULL, &timeout);
if (ret == -) /**< 错误情况 */
{
cout << "error" << endl;
}
else if (ret) /**< 返回值大于0,有数据到来 */
{
if (FD_ISSET(keyboard, &readfd))
{
i = read(keyboard, &c, );
if ('\n' == c)
{
continue;
}
printf("the input is %c\n", c);
if ('q' == c)
{
break;
}
}
}
else /**< 超时 */
{
cout << "time out" << endl;
continue;
}
}
return ;
}
由于是C++文件,因此采用g++ -o select_example select_example.cpp进行编译
最新文章
- Nodejs websocket入门
- [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】
- 实习小记-python 内置函数__eq__函数引发的探索
- Ajax中get提交和post提交的区别
- python模拟http请求
- poj 2100 Graveyard Design
- SpringMVC Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现
- keepalive集群工作原理及应用
- 在Mybatis-spring上基于注解的数据源实现方案
- mysql5.7.X版本only_full_group_by问题解决
- django-admin.py startproject testdj 失败 没有工程文件夹
- 学习ActiveMQ(八):activemq消息的持久化
- CentOS7.3安装Go运行和开发环境
- session token两种登陆方式
- 开发框架-.Net:Learun(力软敏捷开发)
- Linux CentOS 5.5 服务器安装图文教程
- 关于Unity中的特殊文件目录和资源管理(专题四)
- osgearth2.8关于RectangleNodeEditor编辑点不可见的问题
- 【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹
- MFC调试时可以,使用生产的exe时,显示未响应解决方案
热门文章
- SpringBoot系列(五)Mybatis整合完整详细版
- hicharts中treemap添加超链接
- Python Requests-学习笔记(3)-处理json
- shell命令-while语句
- docker-compose 基于Dockerfile 安装并启动redis容器的血案
- Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)
- CentOS8.1.1911正式发布!
- 基于linux或windows平台上的c/s简单通信
- 时间格式的转化 vue与js 年月日 时分秒
- 掉了10根头发都无法解决的数学题,python帮你完美解答