读取由select()发出信号,但recv()不返回数据,并在非阻塞套接字上发出EAGAIN信号

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,它将在内核中修复

有没有人知道它为什么会发生以及如何避免这种不必要的行为?

wil*_*ser 5

将套接字报告为可读的Select()并不意味着有东西要读; 它意味着读取不会阻止.读取可以返回-1或0,但它不会阻塞.

更新:

select之后返回可读:如果read()返回-1,请检查errno.EAGAIN/EWOULDBLOCK和EINTR是要特别处理的值:主要是通过重新发出read(),但您可能信任select循环,下次返回时可读.

如果涉及多个线程,事情可能会变得更加困难.