使用select

首先我们需要解答一些疑惑。为什么要使用select函数?

比如你有一个服务器程序,维护着N多个TCP连接,你如何去判断这些TCP连接上有数据传送过来了呢?最傻瓜的办法就是隔一定时间去循环读一次所有TCP连接对应的

再比如你想编写一个非

如此等等,简而言之,如果你需要监听一组文件描述符(

简单了解了select的功能以后,那么到底怎样调用select函数呢?

1、依赖

select函数是在系统库”sys/select.h”中声明的,其实在系统库“types.h”也include了一下“sys/select.h”,所以,我们在调用select函数之前务必加上头文件”sys/select.h”或者“types.h”。

2、依赖结构体“struct timeval”和“fd_set”

select有五个参数,三种类型,分别是int、struct timeval *和fd_set*,fd_set在”sys/select.h”定义,struct timeval在“time.h”中定义,所以也别忘了把头文件“time.h”加上。

3、需要配合宏变量FD_ZERO(fdsetp)、FD_SET(fd, fdsetp)、FD_ISSET(fd, fdsetp)和FD_CLR(fd, fdsetp)一起调用

其实这四个宏变量的调用方式类似于我们的普通函数,功能也很类似。看看下面的两个宏变量,你应该就理解了吧。

#define min(a,b) ((a) < (b) ? (a) : (b))

#define max(a,b) ((a) > (b) ? (a) : (b))

(1)宏变量FD_ZERO(fdsetp)用来清空整个fd_set结构体对象,形象地说就是fd_set结构体对象用来存储一组你关心的文件描述符(套接字),FD_ZERO负责清空该对象中已有的文件描述符(套接字)。注意:fdsetp需要传入fd_set结构体对象的指针。

(2)宏变量FD_SET(fd, fdsetp)用来将你关心的文件描述符(套接字)fd存入fd_set结构体对象fdsetp中去。注意:fdsetp需要传入fd_set结构体对象的指针。

(3)宏变量FD_ISSET(fd, fdsetp)用来判断你指定的文件描述符(套接字)fd是否满足可读、可写或者错误条件,如果满足则返回非0值,否则返回0。注意:fdsetp需要传入fd_set结构体对象的指针。

(4)宏变量FD_CLR(fd, fdsetp)用来将你指定的文件描述符(套接字)fd从指定fd_set对象fdsetp中清除,即表示不再关心此fd。注意:fdsetp需要传入fd_set结构体对象的指针。

通常情况下,你关心文件描述符(套接字)的几种状态就定义几个fe_set对象,比如我既关心可读属性又关心可写属性,还关心错误属性,那么我就需要分别定义如下三个fd_set对象。

fd_set readfds;

fd_set writefds;

fd_set errorfds;

由此看来,你关心几种状态,也得相对应的调用几次上面四个宏变量。

4、int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

第一个参数:nfds是你关心的所有文件描述符中最大者的值加一;第二、三、四个参数:分别传入可读、可写和错误集合fd_set对象的指针&readfds、&writefds和&errorfds,如果不关心某种状态,就将某种状态对应的参数传入NULL值即可;第五个参数:timeout传入select的阻塞时间,如果传入NULL则select函数会一直阻塞直到有文件描述符可读、可写或者错误。

最后,给出一个整体的调用实例如下。

#include

#include

#include

#define SLEEP_TIME 10

#define MAX_SESSION_UP 100

int main(void)

{

int i;

int fd_num;

int accept_fd_up[MAX_SESSION_UP] = {0};

fd_set readfds;

struct timeval select_timeval;

//you can add some task here, so the fd in accept_fd_up maybe changed here

while (1)

{

FD_ZERO(&readfds);

for (i=0; i

{

if (accept_fd_up[i] > max_sock)

max_sock = accept_fd_up[i];

if (accept_fd_up[i] > 0)

FD_SET(accept_fd_up[i], &readfds);

}

fd_num = select(max_sock+1, &readfds, NULL, NULL, &select_timeval);

if (fd_num < 0)

{

perror("select");

continue;

}

else if (0 == fd_num)

{

printf("select timeout...\n");

//resert the select_time after timeout

select_timeval.tv_sec = SLEEP_TIME;

select_timeval.tv_usec = 0;

//you can add some task here, so the task could work a time every SLEEP_TIME

//the fd in accept_fd_up maybe changed here

continue;

}

for (i=0; i

{

if (FD_ISSET(accept_fd_up[i], &readfds))

{

printf("do case in do_fd_up: %d,%d", accept_fd_up[i], i);

//you can add some task here to deal with the change of the fd

//the fd in accept_fd_up also maybe changed here

}

}

}

}

该实例仅仅只是一个框架而已,它假设有一组大小为MAX_SESSION_UP的int类型数组存储了一堆文件描述符,其中凡是大于0的则默认为我们关心的文件描述符,需要select监管它,小于等于0的则被忽视。

除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。

c语言select函数头文件,简述select函数的功能与调用方法相关推荐

  1. c语言binsearch函数头文件,C++ binary_search()函数详解

    binary_search()函数定义在头文件中,用于查找指定区域内是否包含某个目标元素. 该函数有 2 种语法格式,分别为: //查找 [first, last) 区域内是否包含 val bool ...

  2. c语言eof的头文件,vc eof函数是在哪个头文件里面

    满意答案 winner丶小铭 2013.04.07 采纳率:54%    等级:12 已帮助:9597人 #include 如: #include #include #include #include ...

  3. c语言中常用函数头文件,c语言中常用的函数和头文件

    头文件ctype.h 函数列表 函数类别函数目的详细说明 字符测试为字符和数字的isalnum 是否为isalpha字符 是否控制字符iscntrl 是否为数字isdigit 是否能够显示文字(空格除 ...

  4. 为什么C语言要有头文件(补充)

    1.为什么要有头文件? 为了在组织项目结构的时候,减少大型项目维护成本问题. 2.引用头文件 方法一: 使用#pragmatic once可以包括 1.C头文件 2.所有的变量的声明 3.所有的函数的 ...

  5. C语言编程规范 — 头文件、函数

    0 编码规范说明 0.1 前言 为了提高产品或项目代码质量,软件开发人员编写出简洁.可靠.可维护.可测试.高效.可移植的代码,树立良好的编程规范是非常有必要的,良好的编程规范能提高编程效率,规避很多编 ...

  6. c语言gets函数头文件string.h,string函数头文件

    string.h头文件中有什么函数 string.h头文件中的函数: #include //STL 通用算法 #include //STL 位集容器 #include //复数类 #include / ...

  7. strstr函数头文件_C语言(函数)学习之strstr strcasestr

    一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...

  8. linux延时函数及头文件,linux延时函数

    应用程序的延时函数: 头文件: #include 函数:unsigned int sleep (unsigned int seconds);//n秒 此外:int usleep (useconds_t ...

  9. c++ ofstream 文件不存在_使用C语言中的头文件有什么技巧和注意事项吗?为什么不直接包含C文件呢?...

    从事嵌入式开发多年,对于C语言使用的频率比较多,现在讲讲C语言在平时编程工作中经常出现的一些问题,就以楼主的题目为切入点分析归纳下,分享给正在使用或者学习C语言的小伙伴 C语言头文件有什么用处 在平时 ...

最新文章

  1. 李飞飞宣布成立斯坦福“以人为本AI研究院”
  2. 抽象工廠與工廠方法的區別
  3. html5绘制随机五角星_html5 canvas画五角星(随机生成)
  4. richTextBox设置选中的字体属性
  5. 用Jmeter做微信小程序项目接口测试【案例】
  6. 文件操作-读取文件后文件指针会发生变化
  7. 清除谷歌浏览器的dns缓存
  8. asp.net 使用my97 datepicker实现前后两个日期的范围界定
  9. 初识Java中注解的分类
  10. CSS中id选择器和class选择器
  11. 百度文库需要使用下载券的文档怎么下载
  12. VMPlayer中Ubuntu 20.04鼠标在移动过程中消失的一种处理方法
  13. IPC进程间通信/跨进程通信
  14. linux centos7 录屏,centos7在线安装视频录制软件
  15. QUICK UI 文档
  16. 小学三年级计算机考试题,小学三年级信息技术考试试题
  17. BookKeeper设计介绍及其在Hadoop2.0 Namenode HA方案中的使用分析
  18. 常见的 @Transactional 注解,你确定用对了吗?
  19. Bellhop-水平海底计算案例
  20. PHP微勤,家E课 黄微勤 小学一年级作文二年级作文【写句子】百度...

热门文章

  1. Python MySQL创建数据库
  2. 手机上网流量统计_上半年手机上网流量超552亿GB,你每个月贡献多少?????
  3. python关键字有哪些
  4. 重装系统要注意什么问题
  5. 没业绩,如何写好年终总结?(附100份PPT模版下载)
  6. python画微信表情_python画微信表情
  7. 和领导提了离职,结果他马上给我涨薪,还承诺明年晋升,该不该留下?
  8. 跟领导提离职,被送了本《离开公司你什么都不是》 | 每日趣闻
  9. scala编程初级实践
  10. VueX里的mapGetters