linux c语言 select函数使用方法



表头文件
#i nclude<sys/time.h>

#i nclude<sys/types.h>

#i nclude<unistd.h>
定义函数
int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
函数说明
select()用来等待文件描写叙述词状态的改变。參数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。
错误代码
运行成功则返回文件描写叙述词状态已改变的个数。假设返回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){……}

以下是linux环境下select的一个简单使用方法

#i nclude <sys/time.h>

#i nclude <stdio.h>

#i nclude <sys/types.h>

#i nclude <sys/stat.h>

#i nclude <fcntl.h>

#i nclude <assert.h>

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>0);

  while(1)

    {

  timeout.tv_sec=1;

  timeout.tv_usec=0;

  FD_ZERO(&readfd);

  FD_SET(keyboard,&readfd);

  ret=select(keyboard+1,&readfd,NULL,NULL,&timeout);

  if(FD_ISSET(keyboard,&readfd))

    {

      i=read(keyboard,&c,1);

          if('\n'==c)

          continue;

      printf("hehethe input is %c\n",c);

     

       if ('q'==c)

       break;

      }

  }

}

用来循环读取键盘输入

2007年9月17日,将样例程序作一改动,加上了time out,而且考虑了select得全部的情况:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <assert.h>

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>0);

  while(1)

  {

      timeout.tv_sec=5;

      timeout.tv_usec=0;

      FD_ZERO(&readfd);

      FD_SET(keyboard,&readfd);

      ret=select(keyboard+1,&readfd,NULL,NULL,&timeout);

//select error when ret = -1

      if (ret == -1)

          perror("select error");

//data coming when ret>0

      else if (ret)

      {

          if(FD_ISSET(keyboard,&readfd))

          {

              i=read(keyboard,&c,1);

              if('\n'==c)

                  continue;

              printf("hehethe input is %c\n",c);

if ('q'==c)

              break;

          }

      }

//time out when ret = 0

      else if (ret == 0)

          printf("time out\n");

  }

}

linux c语言 select函数使用方法的更多相关文章

  1. linux c语言 select函数用法

    linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...

  2. 转 linux socket的select函数例子

    使用select函数可以以非阻塞的方式和多个socket通信.程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序. 1. 程序使用 ...

  3. linux 下的select函数

    函数原型 /* According to POSIX.1-2001 */ #include <sys/select.h>  //头文件 /* According to earlier st ...

  4. [原创]C 语言select函数

    参考链接:http://www.cnblogs.com/GameDeveloper/p/3406565.html 注意点: select() 只是执行一次的超时检测.重新进行select要重新设置“超 ...

  5. linux C语言getopt()函数的使用

    getopt被用来解析命令行选项参数. #include <unistd.h> 函数及参数介绍 extern char *optarg; //选项的参数指针,如果选项字符串里的字母后接着冒 ...

  6. R 语言 select函数在org.Hs.eg.db上的运用

    首先org.Hs.eg.db是一个关于人类的 一,在R中导入包library(org.Hs.eg.db) http://www.bioconductor.org/packages/release/da ...

  7. select()函数用法二

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

  8. linux select函数:Linux下select函数的使用详解【转】

    本文转载自;http://www.bkjia.com/article/28216.html Linux下select函数的使用 Linux下select函数的使用 一.Select 函数详细介绍 Se ...

  9. linux c中select使用方法

    1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,& ...

随机推荐

  1. 清除Jquery动画的队列

    当我们在写页面效果时,有时希望当鼠标放到某个元素上,这时会有动态的效果,当鼠标移出时效果会消失.但实际中,如果快速的用鼠标指向元素并移出,反复几次.即便鼠标不再指向这个元素,但这个元素会不停的重复着动 ...

  2. 【mysql优化 3】嵌套循环连接算法

    原文地址:Nested-Loop Join Algorithms mysql在表之间执行连接操作,包括了使用循环嵌套算法或者其他在此基础上的变形. 循环嵌套连接算法: 一个简单的嵌套循环连接(NLJ: ...

  3. hdu2094 stl之set的应用

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 【Luogu】P1110报表统计(Splay)

    题目链接 SBT,我居然没看出来. 就是插入的时候考虑向平衡树里插两个差值,删一个差值. 另一个操作就是维护某元素和其前驱后继的差值最小值就行了. 然后Splay超时了…… (貌似Splay超时了之后 ...

  5. POJ #1025 Department

    模拟题. 这题第一个障碍是现在少见的循环电梯 ('pater-noster' elevator) "The building has `pater-noster' elevator, i.e ...

  6. bzoj 1069 凸包+旋转卡壳

    题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...

  7. Linux 设备驱动的固件加载【转】

    转自:http://blog.csdn.net/zqixiao_09/article/details/51106663 版权声明:本文为博主原创文章,未经博主允许不得转载. 作为一个驱动作者, 你可能 ...

  8. XSD(XML Schema Definition)学习笔记

    今天学习了XSD相关的知识,为了以后查找的方便,写一些笔记. 一.什么是XSD? 1.XSD全称:XML Schema Definition.XML Schema 的作用是定义 XML 文档的合法构建 ...

  9. 51nod 1088 最长回文子串 【中心拓展法/输出长度和路径】

    1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字 ...

  10. [原创][Verilog]个人.v文件书写规范

    1> 文件名命名,小些单词为主且从命名中可以大致读出其功能,例如:fpga_power.v,can_ctrl.v等命名. 2> 顶层top文件的输入输出IO信号使用大些表示,且加上”i/o ...