c - 当recv阻塞时?

标签 c linux epoll

目标是在不阻塞的情况下从套接字读取数据。 Linux 手册页说:

The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.

这是否意味着在使用 select() 轮询套接字描述符后我不必将 MSG_DONTWAIT 标志传递给 recv()/poll()/epoll()?

最佳答案

recv/read的行为取决于套接字本身的特性。如果套接字被标记为非阻塞,这些调用应立即返回 EAGAIN/EWOULDBLOCK 而不是阻塞进程。

在读取套接字之前,可以将套接字标记为非阻塞,通常通过 fcntlioctl

手册中的这段摘录说的是,基本上,阻塞和非阻塞套接字上的读取不需要填充所提供的整个缓冲区。这就是为什么检查 recv/read 调用的结果非常重要,以便了解缓冲区中有多少包含实际数据以及有多少是垃圾。

将阻塞套接字与 IO 轮询调用(例如 select/poll/epoll 结合使用根本不是一个好主意。即使轮询调用表明特定套接字已准备好读取,阻塞套接字有时仍会阻塞。

关于c - 当recv阻塞时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136308/

相关文章:

linux - Silverlight可以在linux上运行吗

写入文件描述符时的 epoll 行为

linux - 同时等待 epoll 和 io_uring

python - 使用 asyncio 时无法使用 os.fork() 将多个进程绑定(bind)到一个套接字服务器

c - 无法访问结构数组中的值

linux - 汇编中 EAX,1 和 EBX,1 的区别?

c - 生产者消费者唯一互斥锁

linux - For 循环的双重变量扩展

c++ - 在 C89 和 C++ 中用空参数调用宏真的是未定义的行为吗?

c - FILE 的数据类型是什么?