Zde*_*nal 6 c sockets recv select-function
我有一个用于从select()读取的信号套接字,但是后来没有数据通过recv call()到达,而是返回-1并且errno == EAGAIN.
我可以授予没有其他线程触及套接字.
我认为这种行为是不正确的.如果从其他方面发生后续关闭,我可以期待返回值0(正常关闭)或来自recv的其他错误代码,但不是EAGAIN,因为这意味着我认为数据将来会到达.
我发现这个问题以前的一些线程在这里,但没有解决方案.
在Ubuntu Linux Oneric或其他最新的Linux发行版上发生了这种行为,然后在此处发布链接信息
对于3.0.0内核或最新的2.6.x,它将在内核中修复
有没有人知道它为什么会发生以及如何避免这种不必要的行为?
将套接字报告为可读的Select()并不意味着有东西要读; 它意味着读取不会阻止.读取可以返回-1或0,但它不会阻塞.
更新:
select之后返回可读:如果read()返回-1,请检查errno.EAGAIN/EWOULDBLOCK和EINTR是要特别处理的值:主要是通过重新发出read(),但您可能信任select循环,下次返回时可读.
如果涉及多个线程,事情可能会变得更加困难.