gpt4 book ai didi

linux - read() 会在 select() 之后阻塞吗?

转载 作者:IT王子 更新时间:2023-10-29 00:22:03 25 4
gpt4 key购买 nike

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

我正在使用 select() 实现超时。它告诉我是否有数据准备好,但我不知道在不导致 read() 阻塞的情况下我到底能读多少。阻塞是 Not Acceptable ,因为它可能持续的时间比我需要的超时时间长得多。

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

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

最佳答案

实际上它不应该阻塞(这就是 select() 的用途!),但事实上,它可能,异常(exception)情况。通常,read() 应该返回您指定的最大字节数,其中可能包括零字节(这实际上是一件有效的事情!),但在之前报告就绪后它永远不会阻塞。

尽管如此,请参阅 Linux select手册页:

Under Linux, select() may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready. Thus it may be safer to use O_NONBLOCK on sockets that should not block.

关于linux - read() 会在 select() 之后阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com