c语言select函数头文件,简述select函数的功能与调用方法
使用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函数的功能与调用方法相关推荐
- c语言binsearch函数头文件,C++ binary_search()函数详解
binary_search()函数定义在头文件中,用于查找指定区域内是否包含某个目标元素. 该函数有 2 种语法格式,分别为: //查找 [first, last) 区域内是否包含 val bool ...
- c语言eof的头文件,vc eof函数是在哪个头文件里面
满意答案 winner丶小铭 2013.04.07 采纳率:54% 等级:12 已帮助:9597人 #include 如: #include #include #include #include ...
- c语言中常用函数头文件,c语言中常用的函数和头文件
头文件ctype.h 函数列表 函数类别函数目的详细说明 字符测试为字符和数字的isalnum 是否为isalpha字符 是否控制字符iscntrl 是否为数字isdigit 是否能够显示文字(空格除 ...
- 为什么C语言要有头文件(补充)
1.为什么要有头文件? 为了在组织项目结构的时候,减少大型项目维护成本问题. 2.引用头文件 方法一: 使用#pragmatic once可以包括 1.C头文件 2.所有的变量的声明 3.所有的函数的 ...
- C语言编程规范 — 头文件、函数
0 编码规范说明 0.1 前言 为了提高产品或项目代码质量,软件开发人员编写出简洁.可靠.可维护.可测试.高效.可移植的代码,树立良好的编程规范是非常有必要的,良好的编程规范能提高编程效率,规避很多编 ...
- c语言gets函数头文件string.h,string函数头文件
string.h头文件中有什么函数 string.h头文件中的函数: #include //STL 通用算法 #include //STL 位集容器 #include //复数类 #include / ...
- strstr函数头文件_C语言(函数)学习之strstr strcasestr
一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...
- linux延时函数及头文件,linux延时函数
应用程序的延时函数: 头文件: #include 函数:unsigned int sleep (unsigned int seconds);//n秒 此外:int usleep (useconds_t ...
- c++ ofstream 文件不存在_使用C语言中的头文件有什么技巧和注意事项吗?为什么不直接包含C文件呢?...
从事嵌入式开发多年,对于C语言使用的频率比较多,现在讲讲C语言在平时编程工作中经常出现的一些问题,就以楼主的题目为切入点分析归纳下,分享给正在使用或者学习C语言的小伙伴 C语言头文件有什么用处 在平时 ...
最新文章
- 李飞飞宣布成立斯坦福“以人为本AI研究院”
- 抽象工廠與工廠方法的區別
- html5绘制随机五角星_html5 canvas画五角星(随机生成)
- richTextBox设置选中的字体属性
- 用Jmeter做微信小程序项目接口测试【案例】
- 文件操作-读取文件后文件指针会发生变化
- 清除谷歌浏览器的dns缓存
- asp.net 使用my97 datepicker实现前后两个日期的范围界定
- 初识Java中注解的分类
- CSS中id选择器和class选择器
- 百度文库需要使用下载券的文档怎么下载
- VMPlayer中Ubuntu 20.04鼠标在移动过程中消失的一种处理方法
- IPC进程间通信/跨进程通信
- linux centos7 录屏,centos7在线安装视频录制软件
- QUICK UI 文档
- 小学三年级计算机考试题,小学三年级信息技术考试试题
- BookKeeper设计介绍及其在Hadoop2.0 Namenode HA方案中的使用分析
- 常见的 @Transactional 注解,你确定用对了吗?
- Bellhop-水平海底计算案例
- PHP微勤,家E课 黄微勤 小学一年级作文二年级作文【写句子】百度...