当前位置: 首页 > 面试题库 >

select()之后read()会阻塞吗?

羊舌勇
2023-03-14
问题内容

我正在通过TCP /
IP套接字读取数据流。流负载非常不均匀。有时每秒会有大量数据到达,有时一个小时没有数据到达。在长时间不活动的情况下(远程服务器没有数据,但连接仍然在线),我的程序应采取一些措施。

我正在使用select()实现超时。它告诉我是否已经准备好数据,但是我不知道在不引起read()阻塞的情况下我可以读取多少数据。阻止是无法接受的,因为它的持续时间可能远远超过我需要的超时时间。

为了提高效率,将流读入大缓冲区,并为该缓冲区提供read()调用。

如果要填充的缓冲区大于套接字中当前可用的数据量,read()将在select()之后阻塞吗?


问题答案:

实际上,它不应该阻塞(这就是select()的目的!),但实际上,它 可能
例外。通常,read()最多应返回您指定的最大字节数,其中可能包括零字节(这实际上是一件有效的事情!),但是在先前报告准备就绪后,它绝不应阻塞。

不过,请参见Linux select手册页:

在Linux下,select()可能会将套接字文件描述符报告为“准备读取”,但是随后的读取会阻塞。例如,这可能在数据到达但检查时校验和错误并被丢弃时发生。在其他情况下,文件描述符可能会虚假地报告为就绪。因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全。



 类似资料:
  • 本文向大家介绍SQL Server中的SELECT会阻塞SELECT吗,包括了SQL Server中的SELECT会阻塞SELECT吗的使用技巧和注意事项,需要的朋友参考一下 前言 在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.TEST WHERE

  • 假设我们有: 线程1,包含actor A、B和C。 包含执行元y的线程2。 包含演员Z的线程3。 演员A和B正在监听演员Y的消息。 然后,参与者C向参与者Z发出阻塞请求。 我包含了Actor Y,以允许它在Z处理来自C的请求时发送消息。 所有线程都在不同的物理核心上--它们并行运行。

  • 问题内容: 注意:这不是有关settimeout的复制文章,此处的关键答案是浏览器设计选项。 我开始研究node.js:一个测试异步的简单示例: 一件有趣的事情是,在带有curl的lind命令和浏览器中,它的行为是不同的:在Ubuntu 12.10中,我在两个控制台中使用curl localhost:8080,它们在几乎相同的10个发送中进行响应。 但是,我打开了两个浏览器,几乎同时发出了请求,但

  • 本文向大家介绍node.js回调函数之阻塞调用与非阻塞调用,包括了node.js回调函数之阻塞调用与非阻塞调用的使用技巧和注意事项,需要的朋友参考一下 首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者

  • 本文向大家介绍css加载会阻塞js运行吗?相关面试题,主要包含被问及css加载会阻塞js运行吗?时的应答技巧和注意事项,需要的朋友参考一下 参考文章

  • 本文向大家介绍css加载会阻塞DOM树解析吗?相关面试题,主要包含被问及css加载会阻塞DOM树解析吗?时的应答技巧和注意事项,需要的朋友参考一下 加载CSS文件阻塞了,原则上会阻塞页面的显示,但是浏览器可以有自己的容错机制,例如下载超时后,均采用user-agent stylesheet 默认样式进行渲染就可以啦,虽然丑点,但是内容在HTML都显示出来,甚至如果没有默认样式直接就不使用css,但