Select的使用
首先解释几个名词
阻塞|非阻塞、同步|异步
同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制.也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者。
阻塞和非阻塞,这两个概念与程序等待消息(无所谓同步或者异步)时的状态有关。
同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合。
Select
函数原型:
int select(int maxfdp,//所有文件描述符的最大值加1
fd_set *readfds,//关注的可读描述符集
fd_set *writefds,//关注的可写描述符集
fd_set *errorfds,//要关注的异常描述符集
struct timeval *timeout//超时时间
);
//从触摸屏读取数据
int ReadFunc(int fd, char *buf, int len)
{
fd_set fset;
struct timeval tv;
int rval;
FD_ZERO(&fset);
FD_SET(fd, &fset);
tv.tv_sec = 1;
tv.tv_usec = 0;
int pos = 0;
int ret = 0;
while(1){
if ((rval = select( fd+1, &fset, NULL, NULL, &tv)) < 0)
{
if (errno == EINTR)
continue;
else
rval = 0;
}
else if (rval)
{
if(FD_ISSET(fd, &fset)){
if(len > 50){
ret = read(fd, buf, len);
}else{
while(len){
ret = read(fd, buf+pos, len-ret);
len -= ret;
pos += ret;
}
}
}
/* if ( rval<0 && errno != ENODEV) */
/* { perror("read"); */
/* } */
}
return rval;
}
}
fd_set *readfds,//关注的可读描述符集
fd_set *writefds,//关注的可写描述符集
fd_set *errorfds,//要关注的异常描述符集
struct timeval *timeout//超时时间
);
//从触摸屏读取数据
int ReadFunc(int fd, char *buf, int len)
{
fd_set fset;
struct timeval tv;
int rval;
FD_ZERO(&fset);
FD_SET(fd, &fset);
tv.tv_sec = 1;
tv.tv_usec = 0;
int pos = 0;
int ret = 0;
while(1){
if ((rval = select( fd+1, &fset, NULL, NULL, &tv)) < 0)
{
if (errno == EINTR)
continue;
else
rval = 0;
}
else if (rval)
{
if(FD_ISSET(fd, &fset)){
if(len > 50){
ret = read(fd, buf, len);
}else{
while(len){
ret = read(fd, buf+pos, len-ret);
len -= ret;
pos += ret;
}
}
}
/* if ( rval<0 && errno != ENODEV) */
/* { perror("read"); */
/* } */
}
return rval;
}
}