select

 

Select函数对数据结构fd_set进行操作,它是由打开的文件描述符构成的集合。有一组定义好的宏可以来控制这些集合

#include<sys/types.h>

#include<sys/time.h>

Void FD_ZERO(fd_set *fdset);

Void FD_CLR(int fd,fd_set *fdset);//用于在集合中设置和清除由参数fd传递的文件描述符。

Void FD_SET(int fd,fd_set *fdset);

Void FD_ISSET(int fd,fd_set *fdset);//如果FD_ISSET宏中由参数fd指向的文件描述符是由参数fdset指向的fd_set集合中的一个元素,FD_SET将返回非零值。

fd_set结构中可以容纳的文件描述符的最大数目由常量FD_SETSIZE指定。

int select(int nfds,fd_set*readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

select用于测试文件描述符集合中,是否有一个文件描述符已处于可读可写或错误状态,它将阻塞以等待某个文件描述符进入上述这些状态。

当select返回时,描述符集合将被修改以指示哪些个描述符正处于可读,可写或出错状态,可以用FD_ISSET对描述符进行测试以找出需要注意的描述符。

select调用返回状态发送变化的描述符总数,失败返回-1。

/*select.c*/
#include<sys/types.h>
#include<sys/time.h>
#include<stdio.h>
#include<fcntl.h>
#include<sys/ioctl.h>
#include<unistd.h>

int main()
{
 char buffer[128];
 int result,nread;
 fd_set inputs,testfds;
 struct timeval timeout;
 FD_ZERO(&inputs);
 FD_SET(0,&inputs);
 /*在标准输入stdin上最多等待输入2.5秒*/
 while(1)
 {
  testfds=inputs;
  timeout.tv_sec=2;
  timeout.tv_usec=500000;
  result=select(FD_SETSIZE,&testfds,(fd_set *)NULL,(fd_set *)NULL,&timeout);
  /*对result进行测试*/
  switch(result)
  {
   case 0:
     printf("timeout\n");
     break;
   case -1:
     perror("select");
     exit(1);
   default:
     if(FD_ISSET(0,&testfds))
     {
      ioctl(0,FIONREAD,&nread);
      if(nread==0)
      {
       printf("keyboard done\n");
       exit(0);
      }
      nread=read(0,buffer,nread);
      buffer[nread]=0;
      printf("read %d from keyboard:%s",nread,buffer);
     }
     break;
  }
 }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值