select函数用法详解
1. select函数
select的作用:
轮询的方式,从多个文件描述符中获取状态变化后的情况。
头文件
#include <sys/time.h> //for struct timeval
#include <unistd.h> //for select
函数原型
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
参数解释
- nfds: 要检测的文件描述符的范围,为文件最大描述符+1
- readfds: 包含所有可能因状态变成可读而触发select函数返回的文件描述符
- writefds: 包含所有可能因状态变成可写而触发select函数返回的文件描述符
- exceptfds: 包含所有可能因状态发生异常而触发select函数返回的文件描述符
void FD_CLR(int fd, fd_set *set); //将fd在set中去除
void FD_SET(int fd, fd_set *set); //将fd添加到set中
int FD_ISSET(int fd, fd_set *set); //检查set中fd是否有状态变化
void FD_ZERO(fd_set *set); //清空整个set
- timeout:
struct timeval {long tv_sec; /* seconds */long tv_usec; /* microseconds */
};
返回值
当超时或其中一个/多个文件描述符发生变化时,此函数将返回,返回值:
- -1: 函数执行出错
- 0: 超时,并将时间结构体清空为0
0: 状态变化的文件描述符的个数
基本实例
fd_set rdfds;
struct timeval tv;
int rtn = 0;FD_ZERO(&rdfds); //清空fd_set
FD_SET(socket, &rdfds); //将要检测的socket描述符加入到fd_set集合中tv.tv_sec = 2;
tv.tv_usec = 1000; //设置超时时间为2s+1msrtn = select(socket+1, &rdfds, NULL, NULL, &tv);if(rtn < 0)perror("select");
else if(0 == rtn)printf("timeout\n");
else
{printf("rtn = %d\n", rtn); //查看有多少个文件描述符发生了变化if(FD_ISSET(socket, &rdfds)) //判断下这个socket是否状态真的变成了可读{recv(...);}
}
2. select做时间函数
void time_delay(int seconds)
{ struct timeval tv;int err;tv.tv_sec = seconds; //超时时间tv.tv_usec = 0;do{err = select(0,NULL,NULL,NULL,&tv); //将nfds设置为0即为超时函数}while(err<0 && errno==EINTR); //
}
3. 未完待续
转载于:https://www.cnblogs.com/Jimmy1988/p/8782469.html
select函数用法详解相关推荐
- select函数用法详解,及实例分析
select函数是系统调用函数,用于多路监控.当没有一个文件满足要求时,select将阻塞调用进程.在有些情况下,采用select函数可以大大简化程序结构.比如一个系统有10个输入设备,如果想实时读取 ...
- linux之select函数用法详解
select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变. 何为文件句 ...
- ROW_NUMBER() OVER()函数用法详解
今天同事问了一个关于插入表的问题,对象:被插入表sys_equi_disorg A , 查询表sys_equi_dict B 因为A表的ID不是自增的,并且不能更改表结构,主键默认值还是0, ...
- mysql 从第几位开始截取_mysql的截取函数用法详解
原标题:mysql的截取函数用法详解 substring()函数 测试数据准备: 用法: 以下语法是mysql自动提示的 1:substirng(str,pos):从指定位置开始截取一直到数据完成 s ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- LayoutInflater的inflate函数用法详解
LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...
- SQL语句 SELECT LIKE用法详解
在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...
- c++ memset 语言_C++中memset函数用法详解
本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...
最新文章
- oracle闪回 分区,Oracle 闪回区(Oracle Flash recovery area)
- OpenStack七年盘点,热潮褪去后的明天在哪?
- C 函数 strstr 的高效实现
- linux shell脚本:通过API实现git仓库从gitee向gitlab的批量迁移(gitlab api)
- linux进行显卡配置修改什么游戏,配置好Linux显卡驱动 爽快玩游戏
- 我的docker随笔25:一个测试用的镜像制作过程
- Nginx之进程间的通信机制(信号、信号量、文件锁)
- Python正则表达式中的贪心模式和非贪心模式
- 解题报告 幸福的道路
- Python实现代码雨效果
- steam授权_恐怖游戏爱好者的福音!十一月Steam上最值得玩的恐怖游戏
- js/vue 动态获取浏览器宽度/高度
- 原生JAVA解析json
- i7-10750H和i7-8750H 对比哪个好
- RocksDB 笔记
- tpm_crb MSFT0101:00: [Firmware Bug]: ACPI region does not cover the entire command/re处理
- 通过shell脚本来rerun一个oozie调度失败的job,从而可以跳过执行失败的节点
- 如何给 SAP Commerce Cloud Site 设置默认语言
- 神舟战神Z8-CA5NP,RTX3060怎么样?测评值得买吗?详细性能点评
- js点击左右按钮来切换多张图片
热门文章
- 如何在WPS、Word里插入高亮代码块
- android 屏幕截图检测,Android 屏幕截图
- vue2.0 使用xlsx读取excel文件数据 操作流程 以及文件中特殊日期数据的处理
- 【源码】非常有用的Vml图像画板
- 专利撰写是什么工作_如何(以及为什么)撰写出色的用户故事
- Android多维商品属性SKU选择
- 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现
- egg项目和DVA项目的目录结构比较
- 多益网络二笔两个编程题
- com.google.guava包里面的相关简单方法