C 中如何复用缓冲 IO?

问题描述 投票:0回答:1

我正在用 C 语言开发一个简单的聊天服务器。为了从所有客户端获取传入消息,我需要使用

select
系统调用。我决定使用
stdio
函数来使其更容易,但我担心库的缓冲会扰乱
select
的使用(即数据将保持缓冲状态,从fd 但不可见)。在 C 中应该使用什么函数来复用缓冲 I/O?

当我写这篇文章时,我记得文件流可以置于无缓冲模式。这行得通吗?

c posix-select
1个回答
3
投票

不幸的是,无缓冲模式无济于事。例如,

fgets()
将希望读取尽可能多的数据,直到读取整行(或者用户提供的缓冲区被填满)。为此,它会多次调用底层
read()
,即使在未缓冲的情况下也是如此,并且第一次之后的调用将不受您的控制。这同样适用于
fscanf()
fprintf()
,甚至
fread()
fwrite()

如果你真的坚持使用stdio,你可以在多个线程中执行阻塞IO,但这不值得这么麻烦(并且潜在的系统过载)。使用多路 IO 的唯一明智的方法是使用低级读取操作来读取数据,然后使用 stdio 工具(例如

sscanf
)来解析它。

© www.soinside.com 2019 - 2024. All rights reserved.