如何使用POSIX select()



select()中使用文件描述符之前,我是否应该使它们非阻塞?

没关系。

select告诉您哪些套接字是可读/可写/关闭的/具有您感兴趣的状态。阻塞/非阻塞影响recvsend呼叫的行为。

无论用来监视的描述符的阻塞状态如何,Select本身都会阻塞。如果你不想让select阻塞,使用一个0的超时(即指向一个0的时间结构,而不是一个nil指针)。

select的目标是阻塞,因此它将忽略非阻塞标志。但是,正如Linux手册页中的bug部分所描述的:

在Linux下,select()可能会将套接字文件描述符报告为"ready for read",然而随后的读取阻塞。例如,当数据到达,但检查时校验和错误并被丢弃时,可能会发生这种情况。可能还有其他的文件描述符被错误地报告为准备好了。因此,在套接字上使用O_NONBLOCK可能更安全不是块。

因此,由于错误的行为,您应该将文件描述符设置为非阻塞

最新更新