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函数用法详解的更多相关文章

  1. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  2. php中setcookie函数用法详解(转)

    php中setcookie函数用法详解:        php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见.        语法:        bool set ...

  3. eval()函数用法详解

    eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数, ...

  4. 转载 LayoutInflater的inflate函数用法详解

    http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...

  5. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  6. C语言对文件的操作函数用法详解2

    fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const  ...

  7. C语言对文件的操作函数用法详解1

    在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...

  8. python开发笔记之zip()函数用法详解

    今天分享一篇关于python下的zip()函数用法. zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原 ...

  9. thinkPHP内置字符串截取msubstr函数用法详解

    作者:陈达辉 字体:[增加 减小] 类型:转载 时间:2016-11-15 我要评论 这篇文章主要介绍了thinkPHP内置字符串截取函数用法,结合实例形式分析了thinkPHP内置的字符串截取函数功 ...

随机推荐

  1. Visualise the Argyris basis functions

    """ Author: kinnala Visualise the Argyris basis functions. """ from sk ...

  2. 使用PerfView监测.NET程序性能(二):Perfview的使用

    在上一篇博客中,我们了解了对Windows及应用程序进行性能分析的基础:Event Trace for Windows (ETW).现在来看看基于ETW的性能分析工具——Perfview.exe Pe ...

  3. Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作

    Decimal类型截取保留N位小数向上取Decimal类型截取保留N位小数并且不进行四舍五入操作 封装静态方法 public class DecimalHelper { /// <summary ...

  4. Vue + Bootstrap 制作炫酷个人简历(一)

    最近看了别人做的简历,简单炫酷,自己非常喜欢,于是打算自己做一个,尝试一下. 由于写这篇随笔的时候才开始动工,所以目前没有成品给大家看. emmm等我更新完会在最后附上成品. 现在 开始! 首先 配置 ...

  5. day 39 jq 学习入门2

    ---恢复内容开始--- 前情提要: jq 是用来降低js 的工作的一个组件 一:利用jq 实现动画效果 <!DOCTYPE html> <html lang="en&qu ...

  6. 使用Express构建RESTful API

    RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...

  7. Windows+MyEclipse+MySQL【连接数据库报错caching_sha2_password】

    在MyEclipse中打开[窗口]->[显示视图]-> MyEclipse Database Browser -> (图片里倒三角)New.... ①Driver template: ...

  8. [umbraco] 数据结构

    我想此图就能说明一切了,不需要再废话了

  9. [转]Express框架

    http://javascript.ruanyifeng.com/nodejs/express.html

  10. 【转载】InstallShield 生成安装日志

    msiexec.exe /p "C:\Documents and Settings\qa\Desktop\8.3 Patch.msp" /l*v c:\log85gold.log ...