当 epoll 发出活动信号时,recv() 调用怎么会阻塞
How could a recv() call block when epoll has signalled activity?
我的应用程序类似于libevent,使用epoll(在级别触发模式下)来检测I/O活动并调用回调来处理它。
我最近发现我的TCP/IP套接字正在阻塞,这是一个意外,但我仍然不希望recv()
调用阻止epoll
报告为已挂起的读取活动。即使套接字有错误,recv()
肯定会回来告诉我。
我对此有什么误解?
在这种情况下,什么样的网络状况会导致recv()
阻塞?
从 Linux 中选择手册页:
(在 Linux 下,select() 可能会将套接字文件描述符报告为"ready 用于阅读",而随后的读取阻止。 这 例如,当数据到达但经过检查时可能发生 校验和错误,被丢弃。 可能还有其他 文件描述符被虚假报告为 准备。 因此O_NONBLOCK,在应该 不阻止。
是的,我知道 epoll() 与 select() 不同,但我怀疑相同的基础条件适用于两者)
我认为如果您真的想避免阻塞,唯一安全的方法是将套接字设置为非阻塞模式。
如果您使用 Epoll 轮询 EPOLLIN 事件,则在此之后的 recv 调用应立即返回。此外,我希望您正在使用非阻塞套接字。如果要查找错误,则可以查找 EPOLLERR 事件。如果套接字在 epoll 信号后关闭,则 recv 应该失败。epoll_wait、epoll_ctl和套接字创建的代码片段将有助于调试问题。
相关文章:
- 在另一个线程中调用luaL_error会引发qWarning
- 使用唯一指针调用函数会使我的程序崩溃
- 缓冲区溢出怎么会成为黑客的攻击
- 从system()调用G++会返回一个错误
- 为什么在杂注 omp 关键之后多次调用 printf 会产生乱码输出?
- 为什么这个变量在函数调用后会搞砸
- 循环迭代后,C 函数调用不会再次调用
- 将std ::向量转换为阵列和当时的p/调用它会导致访问违规例外,在编组期间mscorlib.dll
- 在不存在的记录上调用 remove 会使程序崩溃
- 带指针的调用函数会导致段故障
- C - 为什么合并函数在递归调用后会逆转数组
- CUDA OPENCV CVTCOLOR调用不会将图像转换为不同的格式
- 每次我将(播放旋律 - )代码上传到Arduino时,我按下按钮时,它会在数组中跳过相同的音符.怎么会
- C++:从 pthread 调用 sendmail 会导致管道中断
- 当 epoll 发出活动信号时,recv() 调用怎么会阻塞
- Lib Caffe (C++): input_blobs()[0] 在第一次调用后会导致底部形状错误
- 在具有相同种子的同一程序中对srand()的第二次调用不会为连续的rand()生成相同的值
- 在OpenCV中调用stereoRectify会导致异常:帧指针无效
- 从 C 文件调用C++函数会产生"undefined reference"编译器错误
- 尽管有停止条件,无限递归调用仍会执行,因为参数不会前进