2011-04-05 73 views

回答

6

没关系。

select告诉你哪些套接字是可读/可写/关闭/有你感兴趣的状态。阻塞/非阻塞影响一个recvsend呼叫行为。这些是彼此独立的。

+0

而如果代替套接字我有fd指向管道? – 2011-04-05 16:03:37

+0

同样的事情 - 读写受O_NONBLOCK影响,select不关心阻塞与否。 – Erik 2011-04-05 16:06:27

+0

“无关紧要”在理论上是100%正确的,但在实践中,您仍然应该使描述符不被阻塞,因为在某些系统(例如Linux)上recv可能仍会阻塞,即使已经报告准备就绪。在文档中给出的示例性情况是由于在就绪状态已经发信号之后由于具有不正确的校验和而丢弃的网络分组。 – Damon 2011-04-05 17:20:46

3

不管其用于监视的描述符的阻塞状态如何,选择本身都会阻塞。如果您不想选择阻止,请使用超时0(即指向timeval结构为零,而不是零指针)。

0

select的目标是阻止,所以它会忽略非阻塞标志。但是,如在the bugs section in the Linux manual pages中所述:

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

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