如何使用POSIX select()
How to use POSIX select()
在select()
中使用文件描述符之前,我是否应该使它们非阻塞?
没关系。
select
告诉您哪些套接字是可读/可写/关闭的/具有您感兴趣的状态。阻塞/非阻塞影响recv
或send
呼叫的行为。
无论用来监视的描述符的阻塞状态如何,Select本身都会阻塞。如果你不想让select阻塞,使用一个0的超时(即指向一个0的时间结构,而不是一个nil指针)。
select
的目标是阻塞,因此它将忽略非阻塞标志。但是,正如Linux手册页中的bug部分所描述的:
在Linux下,select()可能会将套接字文件描述符报告为"ready for read",然而随后的读取阻塞。例如,当数据到达,但检查时校验和错误并被丢弃时,可能会发生这种情况。可能还有其他的文件描述符被错误地报告为准备好了。因此,在套接字上使用O_NONBLOCK可能更安全不是块。
因此,由于错误的行为,您应该将文件描述符设置为非阻塞
相关文章:
- SQLite3 在 c++ 中输出 SELECT 上的空列表
- 如何在 sys/select.h 中正确使用
- POSIX open() 挂在 SMB 共享上
- C/C++:POSIX 兼容方式查找默认网络接口上/下
- 使用Boost async_read和POSIX::stream_descriptor从键盘读取
- 没有信号处理程序的POSIX定时器的目的是什么?
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 获取具有字段名称的 SELECT 字段类型,并带有 MariaDB C++连接器
- 强大的 rwlock 在 posix
- 父进程和子进程之间的 POSIX 信号量
- POSIX C/C++日志文件(VEX V5 Brain)
- 适用于win32、linux、mac的POSIX C包装器
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- Winsock2 select():同一个套接字上可能有多个事件吗?
- Winsock2 select() 返回 WSAEINVAL(错误 10022)
- POSIX 条件变量和互斥体"竞争"
- 如何在C++中挂起和恢复 POSIX 线程?
- 将 select() 与非基于文件描述符的输入一起使用
- 了解 POSIX select() 与读写fd_set
- 如何使用POSIX select()