SELECT对linux中read()的影响
effect of SELECT on read() in linux
我有一个遗留代码正在执行此操作:
select(nFD + 1, &tReadFds, NULL, NULL, &timer);
.............
if (FD_ISSET(nFD, &tReadFds))
n = read(nFD,len,x);
是读取将读取整个接收缓冲区(nFD),假设"len"answers"x"足够大。
我认为这里的SELECT只是一种阻塞方式,直到recv缓冲区中的数据可用。
简而言之,select
是一个可以在不阻塞的情况下调用的函数(即它立即返回),返回后它会告诉您一个文件描述符列表,您可以在该列表上调用read
(或write
)而不阻塞。
如果你想在只用一个线程处理I/O的同时提供持久服务,那么这样的函数是至关重要的:在等待I/O的时候,你不能什么都不做,所以你需要一个确定性的方法来确保你可以进行非阻塞I/O。
编辑下面是一个典型的单线程select
服务器的示例,使用伪代码:
while (true)
{
select(...);
read_available_data();
process_data_and_do_work(); // expensive
}
这样的服务器从不需要空闲,而且昂贵的处理功能几乎会占用所有可用的计算时间(它只需要确保在需要更多数据时返回)。我认为select
甚至允许上下文切换,所以这在多进程环境中会很好。
代码片段使用非NULL
超时参数调用select()
。代码等待套接字变得可读的时间最长。如果超时已过,则套接字不可读,FD_ISSET()
将返回false
,跳过read()
调用。但是,如果套接字在超时之前变得可读,则FD_ISSET()
将返回true,并且对read()
的调用保证不会阻塞调用线程。它将立即返回,或者返回套接字的接收缓冲区中当前的任何数据(最大可达len
字节),或者如果远程方已正常断开连接,则返回0。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在容量内调整矢量大小时的性能影响
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 未达到的情况会影响开关外壳性能
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- write() 和 read() 中几乎没有混淆
- 模板如何影响C++中隐式声明的规则?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 命名空间信息会影响C++的可读性
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 对同一文件使用 .read 的次数是否有限制?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- SELECT对linux中read()的影响