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. Spring配置文件中使用ref local与ref bean的区别

    Spring配置文件中使用ref local与ref bean的区别.在ApplicationResources.properties文件中,使用<ref bean>与<ref lo ...

  2. CentOS7下RabbitMQ服务安装配置胜多负少

    RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...

  3. php rabbitmq操作类及生产者和消费者实例代码 转

    注意事项: 1.accept.php消费者代码需要在命令行执行 2.'username'=>'asdf','password'=>'123456' 改成自己的帐号和密码 RabbitMQC ...

  4. 用meta标签让网页用360打开时默认为极速模式

    最近做项目,用360浏览器访问自己的本地网页,发现都是默认在兼容模式下打开,做的淡入淡出轮播效果在兼容模式下看时,感觉切换很生硬.百度,发现360官网帮助里有说明用meta标签控制浏览器内核,网址为h ...

  5. Java NIO系列教程(三-十二) Buffer

    原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...

  6. C++拷贝(复制)构造函数详解

    原文:http://blog.csdn.net/lwbeyond/article/details/6202256/[侵删] 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单 ...

  7. Python struct 详解

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

  8. 在AxureRP8中实现广告文字滚动效果

    本文是实现动态文字在一个区域中滚动的效果,大概实现过程如下: 先准备一个区域,然后让文字在该区域内水平移动,本文是实现了从右到左的轮询的效果,其他雷同. 在Axure中,这种移动的过程需要动态移动,利 ...

  9. 正确使用‘trap指令’实现Docker优雅退出

    一般应用(比如mariadb)都会有一个退出命令,用户使用类似systemctl stop ****.service方法,停止其服务时,systemd会调用其配置文件注册的退出命令,该命令执行清理资源 ...

  10. 大文件LOG持续输出

    作了两个版本,一是websocket输出,一是直接显示指定行数. class WebSocketHandler(tornado.websocket.WebSocketHandler): file_co ...