在我使用select()
之前,我使文件描述符非阻塞?如何使用POSIX select()
3
A
回答
6
没关系。
select
告诉你哪些套接字是可读/可写/关闭/有你感兴趣的状态。阻塞/非阻塞影响一个recv
或send
呼叫行为。这些是彼此独立的。
3
不管其用于监视的描述符的阻塞状态如何,选择本身都会阻塞。如果您不想选择阻止,请使用超时0(即指向timeval结构为零,而不是零指针)。
0
select
的目标是阻止,所以它会忽略非阻塞标志。但是,如在the bugs section in the Linux manual pages中所述:
在Linux下,select()可能报告套接字文件描述符为“准备好读取”,而后续读取块。例如,这可能发生在数据到达但检查错误校验和并被丢弃时发生。可能有其他 情况,其中文件描述符虚假地报告为 就绪。因此,在应该不会阻塞的套接字上使用O_NONBLOCK可能更安全。
因此,由于错误行为,应该将文件描述符设置为非阻塞。
相关问题
- 1. 如何使用JXA中的POSIX路径
- 2. 如何使用S_ISREG()和S_ISDIR()POSIX宏?
- 3. 如何使用SELECT?
- 4. 如何实现基于POSIX select()的行为,在boost :: asio
- 5. 如何使用select和stdout?
- 6. SELECT FOR XML,如何使用?
- 7. 如何使用SELECT DISTINCT
- 8. 如何使用SELECT DISTINCT
- 9. 如何在jQuery Datepicker中使用POSIX Timestamp格式来使用秒?
- 10. 使用POSIX从PHP,Windows
- 11. 使用posix semphores问题
- 12. HDFS如何放松POSIX
- 13. 使用STL/POSIX从J2SE加载二进制文件iphone使用STL/POSIX
- 14. 如何实现阻塞读取使用POSIX线程
- 15. 如何在QT中使用QThreads实现POSIX消息传递?
- 16. 这是如何使用poll(2)的posix队列?
- 17. C,如何在分叉进程上使用POSIX信号量?
- 18. 在Posix中,dev_t类型如何被使用?
- 19. 如何使用yum轻松地为PHP添加posix支持?
- 20. 如何使用cygwin从posix切换到Windows
- 21. 如何在POSIX和Date对象上使用alignDaily?
- 22. 如何让thread2在c中使用posix-threads等待thread1
- 23. 如何使用Esqueleto做一个“SELECT ... IN(SELECT ...)”?
- 24. 如何使用jQuery获取select,然后设置select的值?
- 25. 如何使用LINQ做SELECT UNIQUE?
- 26. 如何在更新中使用select?
- 27. 如何使用mdl-select和md-option
- 28. 我如何使用SQL SELECT语句
- 29. 如何在MySQL中使用UPDATE SELECT
- 30. 如何在子SELECT中使用WHERE?
而如果代替套接字我有fd指向管道? – 2011-04-05 16:03:37
同样的事情 - 读写受O_NONBLOCK影响,select不关心阻塞与否。 – Erik 2011-04-05 16:06:27
“无关紧要”在理论上是100%正确的,但在实践中,您仍然应该使描述符不被阻塞,因为在某些系统(例如Linux)上recv可能仍会阻塞,即使已经报告准备就绪。在文档中给出的示例性情况是由于在就绪状态已经发信号之后由于具有不正确的校验和而丢弃的网络分组。 – Damon 2011-04-05 17:20:46