目标是在不阻塞的情况下从套接字读取数据。Linux手册页说:
接收调用通常会返回任何可用的数据,直到请求的数量,而不是等待接收请求的全部数量。
这是否意味着在使用/ /轮询套接字描述符后我不必将MSG_DONTWAIT标志传递给?recv()select()poll()epoll()
recv/的行为read取决于套接字本身的特性。如果套接字被标记为非阻塞,这些调用应该立即返回EAGAIN/EWOULDBLOCK而不是阻塞进程。
套接字可以在读取之前标记为非阻塞,通常通过fcntl或ioctl。
该手册的摘录内容是,基本上,不需要对阻塞和非阻塞套接字进行读取来填充所提供的整个缓冲区。这就是为什么检查recv/read调用的结果很重要,以便了解缓冲区中有多少包含实际数据以及有多少是垃圾。
select将阻塞套接字与 IO 轮询调用(例如/ poll/ )结合使用根本不是一个好主意epoll。即使轮询调用指示特定套接字已准备好读取,阻塞套接字有时仍会阻塞。