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

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值