目的是从套接字读取数据而不会阻塞。 Linux手册页显示:
这是否意味着在用MSG_DONTWAIT
/recv()
/select()
轮询套接字描述符后,我不必将poll()
标志传递给epoll()
吗?
最佳答案
recv
/read
的行为取决于套接字本身的特性。如果套接字被标记为非阻塞,则这些调用应立即返回EAGAIN
/EWOULDBLOCK
,而不是阻塞进程。
可以在从套接字读取之前将其标记为非阻塞,通常通过fcntl
或ioctl
。
该手册的摘录说的是,基本上,不需要读取阻塞套接字和非阻塞套接字来填充所提供的整个缓冲区。这就是为什么检查recv
/read
调用的结果以便知道多少缓冲区包含实际数据以及多少是垃圾是很重要的。
将阻塞套接字与IOt轮询调用(例如select
/poll
/epoll
)结合使用根本不是一个好主意。即使轮询调用表明已准备好读取特定的套接字,阻塞的套接字有时仍会阻塞。
关于c - 什么时候接收阻止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15136308/