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第十六天,list接口

    List接口 1.三大特点: ① 有序.② 有索引. ③ 允许存在重复元素. 注意: ① 利用list接口的索引执行操作时,要防止索引越界引起的程序错误. 2.基本使用: 针对List接口有索引的特点 ...

  2. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  3. spring 中 hibernate 的 2种 配置方式(新旧 2种方式)

    Spring对hibernate配置文件hibernate.cfg.xml的集成,来取代hibernate.cfg.xml的配置 Spring对hibernate配置文件hibernate.cfg.x ...

  4. tomcat查看线程数

    获取tomcat进程pid ps -ef|grep tomcat 统计该tomcat进程内的线程个数 ps -Lf 29295 |wc -l

  5. 【Java】抽象类、接口

    什么是抽象类? 特点: - 抽象类几乎普通类一样,除了不能实例化 - 不能实例化不代表没有构造器,依然可以声明构造器,便于子类实例化调用 - 具有抽象方法的类,一定是抽象类 abstract 抽象的 ...

  6. Progress笔记

    1. iconv -f gbk -t unicode test.tmp > test.csv 如果出现文件数据补全,需要确认在这之前,output是否已经close,如果output to指定了 ...

  7. 杭电 How far away ?

    There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...

  8. linq 高集成化数据访问技术

    一:  新建名为linq的项目 创建 linq 1 在项目里添加文件夹 App_Code; 2 在文件夹(App_Code) 添加  名为db的    Linq To Sql 类  :一个Linq T ...

  9. # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理

    第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...

  10. 2018版移动端ui规范

    计规范是一种将移动端常用控件标准化.统一化的的文档 今天整理了一篇设计规范的文章概论,讲诉中会以ios做介绍,安卓由于开源,平台相对教多不做单一阐述,实际操作的时候,我们不管是做一代还是二次的迭代产品 ...