select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr。

函数原型是:int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);参数n代表文件描述词加1;参数readfds、writefds 和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。下面的宏提供了处理这三种描述词组的方式:
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的全部位

参数timeout为结构timeval,用来设置select()的等待时间,其结构定义如下:
struct timeval
{
       time_t tv_sec;
       time_t tv_usec;
};
如果参数timeout设为NULL,则表示select()没有timeout。

select函数执行结果:执行成功则返回文件描述词状态已改变的个数;如果返回0代表在描述词状态改变前已超过timeout时间,没有返回;当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。错误值可能为:
EBADF 文件描述词为无效的或该文件已关闭
EINTR 此调用被信号所中断
EINVAL 参数n 为负值。
ENOMEM 核心内存不足

常见的程序片段如下:

fs_set readset;
FD_ZERO(&readset);
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset){……}

检测键盘有无输入,完整的程序如下:

#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{char buf[10]="";fd_set rdfds;struct timeval tv;int ret;FD_ZERO(&rdfds);FD_SET(0,&rdfds);   //文件描述符0表示stdin键盘输入tv.tv_sec = 3;tv.tv_usec = 500;ret = select(1,&rdfds,NULL,NULL,&tv);      //第一个参数是监控句柄号+1if(ret<0)printf("selcet error\r\n");else if(ret == 0)printf("timeout \r\n");elseprintf("ret = %d \r\n",ret);if(FD_ISSET(0,&rdfds)){          //监控输入的确是已经发生了改变printf(" reading");read(0,buf,9);                 //从键盘读取输入}write(1,buf,strlen(buf));         //在终端中回显printf(" %d \r\n",strlen(buf));return 0;
}

用gcc编译,执行./a.out。可以得到执行结果,如果不输入,则一会儿会回显:

如果有输入,则回显:

第一个"s"是打字输入的回显。后面开始执行,有个疑问是:在stdout的输出为什么会出现在reading显示的前面?论执行顺序应该是后面才对。

参考原文:http://www.91linux.com/html/article/kernel/20090102/15232.html

linux select函数用法相关推荐

  1. linux c语言 select函数用法

    原文地址:点击打开链接 linux c语言 select函数用法 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 co ...

  2. Linux select函数用法和原理

    select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大 ...

  3. linux之select函数用法详解

    select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变.   何为文件句 ...

  4. linux select函数好处,linux下的epoll较之传统的select函数比较其优点

    linux下的epoll较之传统的select函数比较其优点 突破了单进程打开SOCKET描述符最大数目的限制,select单进程打开FD的数据是有限制的,由FD_SETSIZE设置,默认值是2048 ...

  5. linux select函数详解

    在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状态.(我们是要想从一个文件描述符中 ...

  6. Linux select函数的使用

    文章目录 一.select函数 1.fd_set结构体 FD_ZERO FD_SET FD_CLR FD_ISSET 2.timeval 结构体 3.返回值 二.文件描述符就绪条件 三.使用 一.se ...

  7. select函数用法

    首先,看看这个程序服务端设计的基本逻辑,其实非常简单,就在一个while(1)循环里面不停地轮询 accept 和 select函数. 有人可能问,accept不是会阻塞,直到有客户端连接进来的吗? ...

  8. select函数用法详解

    1. select函数 select的作用: 轮询的方式,从多个文件描述符中获取状态变化后的情况. 头文件 #include <sys/time.h> //for struct timev ...

  9. linux select函数返回值,socket中的select函数使用

    socket select()函数用于定时检查以创建的socket句柄的状态,以确定设定的socket句柄当前是否可写或有数据可读. select函数提供了一种方法,使得程序在操作socket时(如r ...

最新文章

  1. ACM题目:救济金发放
  2. Android Service下载文件并自定义通知提示下载
  3. 网络编程-TCP/IP协议栈-UDP/HTTP协议
  4. Spring boot配置项目访问路径server.context-path不起作用(改为server.servlet.context-path)
  5. dao-service-servlet-jsp构建简易web通讯录(三层开发)预备知识
  6. 每个极客都应该知道的Linux技巧(区分开普通的Linux用户和超级极客)
  7. CentOS7 yum 安装 maven
  8. pcb板生产的工艺流程有哪些?
  9. Java根据身份证号或者出生日期计算年龄
  10. WARN: Establishing SSL connection without server‘s identity verification is not recommended
  11. SNAP Java API处理Sentinel-1数据
  12. 海洋cms模板,海洋cms模板程序源码,海洋cms模板制作方法
  13. No module named gi解决方案
  14. 把opencv Mat 按位存成bmp二值图像 (1bit 1pixel)
  15. 多机器人路径规划CBS/ECBS等 libmultiRobotPlanning 代码阅读笔记
  16. 猿辅导2019 编程两道
  17. [大学物理实验-5]波尔共振实验
  18. MKMapView用法
  19. Java 海康SDK透明通道建立(485透传)
  20. 最新最全论文合集——SODA 历年最佳论文汇总

热门文章

  1. TSYS2.0对动态碎片的一点理解
  2. Android导入第三方jar包
  3. cocos2dx视频教程进阶篇--第2天--打砖块游戏-box2d物理引擎--续
  4. Android手机中第三方签名应用程序无法获得的permission
  5. 大规模细粒度分类和特定领域的迁移学习
  6. 毕业五年同是程序员为什么差距这么大?他年薪百万,他月薪一万
  7. Java 面向对象 之 封装方法
  8. 深入学习Make命令和Makefile(上)
  9. MyBatis 之 SqlMapConfig.xml 配置
  10. fopen 參数具体解释