这两天写了这么一段代码,select直接返回-1,错误信息是“invalid argments”,显然没有达到阻塞超时的效果。
代码如下:
bool IsSocketWaitRead(inf fd,int usec)
{
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd,&rfds);
struct timeval t_out;
t_out.tv_sec = 0;
t_out.tv_usec = usec;
return select(fd+1,&rfds,NULL,NULL,&t_out) > 0? true : false;
}
这段代码在标准的linux环境可以运行,但是在ARM体系架构的国产化操作系统下,返回值永远是-1
修改之后:
bool IsSocketWaitRead(int fd,int ms)
{
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd,&rfds);
struct timeval t_out;
memset(&t_out,0,sizeof(struct timeval));
t_out.tv_sec = ms/1000;
t_out.tv_usec = (ms%1000) *1000;
return select(sockfd+1,&rfds,NULL,NULL,&t_out) > 0? true : false;
}
从这段代码中,参数t_out设置的有问题。这也警告我们,在使用别的函数时,也要初始化struct。
总结:
select函数在linux系统编程使用频率很多,它可以监测文件描述符的读写事件,也可以实现小并发服务器。
一个结构体的初始化,考验的是编程细节。