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. 【bzoj1585】[Usaco2009 Mar]Earthquake Damage 2 地震伤害 网络流最小割

    题目描述 Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着两个牧场Ai和Bi,注意可能有很多条道路连接着相同的Ai和Bi,并且Ai有可能和Bi相等.Farmer J ...

  2. string流;

    string流定义在头文件<sstream>中: 可以像标准输入输出流一样,自动判别数据类型输出,遇到空格停止: 定义: stringstream ss:   //定义了一个string流 ...

  3. [luoguP2761] 软件补丁问题(状压最短路)

    传送门 n <= 20 很小 所以可以状态压缩 然后因为可能存在环,所以不能DP 那么就用spfa找最短路 被位运算坑了,不清楚优先级一定要加括号 ——代码 #include <queue ...

  4. 刷题总结——run(ssoj)

    题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...

  5. LA 3905 Meteor 扫描线

    The famous Korean internet company nhn has provided an internet-based photo service which allows The ...

  6. 开始学习es6(一) 搭建个es6的开发环境

    1.开始学习es6 如果想在浏览器跑es6  需要给es6个环境 因为一直用vue-cli全家桶 这样虽然方便 但如果用es6需要跑起个vue全家桶 于是想到可以用gulp搭建个开发环境 首先需要1. ...

  7. Android组件实例化问题

    对于Application. Activity. Notification. BroadCast. Service 这些组件的使用,对象的实例化问题各有不同,如何实例化以及在什么时候实例化也所有不同. ...

  8. pycharm提示your evalluation license has expired解决方法

    安装pycharm,一段时间后提示your evalluation license has expired:打开pycharm--点击help--register--选中license server, ...

  9. 将xml转换为PHP数组

    这里提供一个类来将XML转换为PHP数组,下面是类的代码 <?php/** * XML2Array: A class to convert XML to array in PHP * It re ...

  10. jQuery 1.4版本的15个新功能(现在已经发布到jquery1.8,特别是增强版的live事件,支持 submit , change , focus 和 blur 事件)

    1.jQuery()创建DOM元素:支持传参设置属性 之前,jQuery可以通过 attr 方法设置元素的属性,既可传属性的名和值,也可以是包含几组特定 属性名值对 的 对象.在 jQuery 1.4 ...