zoukankan      html  css  js  c++  java
  • linux c语言 select函数使用方法

    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(' '==c)
              continue;
          printf("hehethe input is %c ",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(' '==c)
                      continue;
                  printf("hehethe input is %c ",c);

                  if ('q'==c)
                  break;
              }
          }

          //time out when ret = 0
          else if (ret == 0)
              printf("time out ");
      }
    }

  • 相关阅读:
    HDU 1069 Monkey and Banana
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    Gym100923H Por Costel and the Match
    Codeforces 682C Alyona and the Tree
    Codeforces 449B Jzzhu and Cities
    Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes
    Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
    Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
    快乐数问题
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6794740.html
Copyright © 2011-2022 走看看