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;
}
}
}