select函数是 I/O 复用中非常重要的一个函数,属于并发编程的。它能够监视我们需要监视的文件描述符的变化情况–读、写或者异常

1. 函数原型

#include <sys/select.h>

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set*errorfds,struct timeval *timeout

select将文件描述符放入一个集合,成为文件描述符集fd_set

2. 参数

1. maxfdp是一个整数值,集合中文件描述符的范围,所有文件描述符最大值 + 1

2. fd_set *readfds。读文件描述符集,关心文件描述符的读变化

3. fd_set *writefds。写文件描述符集,关心文件描述符的写变化

4. fd_set *errorfds。监视文件错误异常

5. struct timeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态。

    第一:NULL,即不传入时间结构,就是将select至于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变换为止;

    第二:0秒0毫秒,就变成了一个纯粹的非阻塞函数,不管文件描述符有无变化,立刻返回。无变化返回0, 有变化返回一个正值

    第三:timeout的值大于0,select在timeout时间内阻塞,超时时间之内有事件到来就返回,否则立即返回,返回值同第二条

3. 返回值

负值:select错误

正值:某些文件可读、可写或者出错

0:等待超时,没有可读、可写或者出错的文件

4. 相关宏

FD_CLR(inr fd,fd_set* set);        用来清除描述词组set中相关fd的位

FD_ISSET(int fd,fd_set *set);    用来测试描述词组set中相关fd的位是否为真

FD_SET(int fd,fd_set*set);        用来设置描述词组set中相关fd的位

FD_ZERO(fd_set *set);             用来清除描述词组set的全部位

struct timeval代表时间值,一个是秒数、另一个微妙

#include <sys/time.h>
struct timeval
{
time_t tv_sec; //seconds 秒
time_t tv_usec; //microseconds 微秒,1000000 微秒 = 1秒
};

5. select_example.cpp

Linux下监控键盘上是否有数据到来

#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h> #include <unistd.h>
#include <iostream> using namespace std; int main()
{
int keyboard;
int ret,i;
char c;
fd_set readfd;
struct timeval timeout; keyboard = open("/dev/tty",O_RDONLY | O_NONBLOCK);
assert(keyboard > ); while ()
{
timeout.tv_sec = ;
timeout.tv_usec = ;
FD_ZERO(&readfd);
FD_SET(keyboard,&readfd); ret = select(keyboard + , &readfd, NULL, NULL, &timeout);
if (ret == -) /**< 错误情况 */
{
cout << "error" << endl;
}
else if (ret) /**< 返回值大于0,有数据到来 */
{
if (FD_ISSET(keyboard, &readfd))
{
i = read(keyboard, &c, );
if ('\n' == c)
{
continue;
}
printf("the input is %c\n", c);
if ('q' == c)
{
break;
}
}
}
else /**< 超时 */
{
cout << "time out" << endl;
continue;
}
}
return ;
}

由于是C++文件,因此采用g++ -o select_example select_example.cpp进行编译

select函数的使用的更多相关文章

  1. (十二)select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...

  2. select 函数1

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  3. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    http://hi.baidu.com/%B1%D5%C4%BF%B3%C9%B7%F0/blog/item/e7284ef16bcec3c70a46e05e.html select函数用于在非阻塞中 ...

  4. PHP Socket实现websocket(四)Select函数

    int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); /* ...

  5. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  6. I/O多路复用——select函数与poll函数

    1 区别 同:(1)机制类似,本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理.(2)包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就 ...

  7. select函数

    select函数: http://baike.baidu.com/view/3421856.htm select函数   目录 概况 操作程序 宏解释 socket读写 概况 select()的机制中 ...

  8. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...

  9. 阻塞、非阻塞的概念和select函数的阻塞功能

    其它文档: http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html (1)阻塞block     所谓阻塞方式block,顾名思义 ...

  10. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h>       ...

随机推荐

  1. Java第十二天,权限修饰符

    Java当中权限修饰符共有四种.分别是public.protected.(default).private. 注:YSE代表可访问,NO代表不可访问.   同一个类 同一个包,非继承 不同的包,有继承 ...

  2. python3(二十九) orderClass

    """ """ __author__ = 'shaozhiqi' # Python的class中还有许多有特殊用途的函数,可以帮助我们定制类 ...

  3. go中的线程的实现模型-P G M的调度

    线程实现模型 go中线程的实现是依靠 P G M M machine的缩写.一个M代表一个内核线程,或称“工作线程” P processor的缩写.一个P代表执行一个Go代码片段所需要的资源(或称“上 ...

  4. 一个spring 基本知识的微博(怎么加载多个xml、多个property文件、aop配置、监视器)

    http://blog.sina.com.cn/s/blog_61c5866d0100ev44.html

  5. c++ 启发式搜索解决八数码问题

    本文对八数码问题 启发式搜索 (C++)做了一点点修改 //fn=gn+hn #include<iostream> #include<queue> #include<st ...

  6. HttpWebRequest在Post的时候,遇到特殊符号+号(加号)变成空格了

    今天在调用一个外部接口的时候遇到一个问题,外部接口说要用FOMR的POST方法提交. OK,没问题,我加了个ASPX页面,里面加了个FORM表单和一些元素,提交,返回值成功.注意看下面这一句:但返回值 ...

  7. 这价格看得我偷偷摸了泪——用python爬取北京二手房数据

    如果想了解更多关于python的应用,可以私信我,或者加群,里面到资料都是免费的 http://t.cn/A6Zvjdun 近期,有个朋友联系我,想统计一下北京二手房的相关的数据,而自己用Excel统 ...

  8. 【JAVA】并发-基础IO

    一.java.io包支持.java的IO流有输入.输出两种,每种输入.输出流又可分为字节流.字符流两大类,字节流以字节为单位处理IO操作,字符流以字符为单位处理IO操作 JDK 1.4以后有java. ...

  9. SpringBoot系列(九)单,多文件上传的正确姿势

    SpringBoot系列(九)分分钟解决文件上传 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配 ...

  10. secureCRT常用操作

    直接在网上搜索下载 连接 选择协议 Telnet Telnet连接时,进入输入密码 串口 连接串口后,查看本机连接的串口号 新建的时候,选择相同的串口号 RTS需要勾选掉 外观字体 选项 => ...