3

我应该在使用文件描述符之前使它们成为非阻塞的select()吗?

4

3 回答 3

6

没关系。

select告诉您哪些套接字是可读/可写/已关闭/具有您感兴趣的状态。阻塞/非阻塞会影响例如 arecvsendcall 的行为。这些是相互独立的。

于 2011-04-05T16:00:17.640 回答
3

Select 本身将阻塞,无论它用于监视的描述符的阻塞状态如何。如果您不希望 select 阻塞,请使用 0 超时(即指向零的 timeval 结构,而不是 nil 指针)。

于 2011-04-05T16:08:53.163 回答
0

的目标select是阻塞,所以它会忽略非阻塞标志。但是,如Linux 手册页中的错误部分所述

在 Linux 下,select() 可能会将套接字文件描述符报告为“准备好读取”,但随后会出现读取块。例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为就绪的其他情况。因此,在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。

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

于 2013-11-03T11:25:38.593 回答