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+1ms
rtn = 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. 未完待续
select函数用法详解的更多相关文章
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- php中setcookie函数用法详解(转)
php中setcookie函数用法详解: php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见. 语法: bool set ...
- eval()函数用法详解
eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数, ...
- 转载 LayoutInflater的inflate函数用法详解
http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...
- delphi中Application.MessageBox函数用法详解
delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...
- C语言对文件的操作函数用法详解2
fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const ...
- C语言对文件的操作函数用法详解1
在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...
- python开发笔记之zip()函数用法详解
今天分享一篇关于python下的zip()函数用法. zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原 ...
- thinkPHP内置字符串截取msubstr函数用法详解
作者:陈达辉 字体:[增加 减小] 类型:转载 时间:2016-11-15 我要评论 这篇文章主要介绍了thinkPHP内置字符串截取函数用法,结合实例形式分析了thinkPHP内置的字符串截取函数功 ...
随机推荐
- 纯净得只剩下字的访问IP查询API
纯净得只剩下字的访问IP查询API 实用资源 / 2018-02-26 / 3 条评论 看到一个好玩的,就随手收藏一下,本API作用:获取用户真实IP,而获取用户IP常见的坑有两个,开发支付的时候也需 ...
- Delphi 与 Word_VBA
'插入表格Sub setTable() Set myRange = ActiveDocument.Range(Start:=2, End:=2) ActiveDocument.Tables.Add ...
- Linux-帮助与基本命令
1.获取命令帮助 Linux中的命令按可分类shell内嵌命令.外部命令,获取命令帮助信息前需要区分命令类型. 1.1 type - 查看命令类型 [root@VM_0_171_centos ~]# ...
- 数据单位bit byte kb Mb Gb
8 bit = 1 byte 2^10 bytes = 1 kb 2^10 kb = 1 Mb 2^10 Mb = 1Gb 2^32 bit = 2^2 * 2^10 * 2^10 * 2^10 bi ...
- ubuntu18.10安装redis遇到问题
执行命令apt-get install redis-server 安装遇到的问题 1.出现apt-get被占用情况,用ps -a|grep apt ,杀死存在的apt进程 2.还不行就执行sudo f ...
- linux的cd命令
面试时被问到了一个命令是什么意思 cd - 还真是一脸懵逼.... 回来试了下 发现真的是一个神奇的命令~ 会跳到之前目录下并输出, 比如
- ConcurrentHashMap源码解析(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http:/ ...
- Android 四大组件之" ContentProvider "
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
- js中获取当前页面的url
在js中可以通过下面的方式获取当前页面url的相关信息 var item = window.location // 返回的是对象, 这个对象里有各种关于url的信息 var url = window. ...
- Python大黑阔—url采集+exp验证,带你批量测试
i春秋作家:大木瓜 前言: 最近几天在整理从各处收集来的各种工具包,大大小小的塞满了十几个G的硬盘,无意间发现了一个好几年前的0day.心血来潮就拿去试了一下,没想到真的还可以用,不过那些站点都已经老 ...