select: Invalid argument

        今天在编写一个Linux应用程序时候调用 select 函数判断是否有数据可读,在RK3399开发板Linux-4.4内核环境下测试,select调用失败,输出信息是 "select: Invalid argument" ,但是在Ubutu-16.04环境下测试却是成功的。一开始检查调用参数,感觉都没问题,但是在开发板上测试就是会失败,这算是一个比较罕见的典型错误了。

先上错误代码片段:

struct timeval tv;		 
tv.tv_sec    = 0;
tv.tv_usec   = 1000 * 1000 * 5;   
FD_ZERO(&readset);               
FD_SET(sock_fd, &readset);      
ret = select(sock_fd+1, &readset, NULL, NULL, &tv);

读者也可以先分析上面代码,是否有错误,应该第一眼感觉都是没有错误,正确!但是在RK3399 Linux4.4内核环境测试却始终会失败,显示参数非法,那到底是哪里参数非法?

 

上面代码问题出现在  tv.tv_usec   = 1000 * 1000 * 5; 赋值上,最终于的值过大了,当内核限制了tv_usec有效数值范围时,并且对这个成员值范围检测时,就会出现参数无效的错误。解决方法是修改对  tv.tv_usec    赋值。

 

struct timeval tv;		 
tv.tv_sec    = 1000 * 1000 * 5;
tv.tv_usec   = 0;   
FD_ZERO(&readset);               
FD_SET(sock_fd, &readset);      
ret = select(sock_fd+1, &readset, NULL, NULL, &tv);

这真是一个非常典型的错误,一不小心犯错了,并且还不容易发现,特此记录!!!!

这真一个非常隐晦的错误 。解决的  

你可能感兴趣的:(linux应用编程问题记录)