我正在用 C 语言开发一个简单的聊天服务器。为了从所有客户端获取传入消息,我需要使用
select
系统调用。我决定使用 stdio
函数来使其更容易,但我担心库的缓冲会扰乱 select
的使用(即数据将保持缓冲状态,从fd 但不可见)。在 C 中应该使用什么函数来复用缓冲 I/O?
当我写这篇文章时,我记得文件流可以置于无缓冲模式。这行得通吗?
不幸的是,无缓冲模式无济于事。例如,
fgets()
将希望读取尽可能多的数据,直到读取整行(或者用户提供的缓冲区被填满)。为此,它会多次调用底层 read()
,即使在未缓冲的情况下也是如此,并且第一次之后的调用将不受您的控制。这同样适用于fscanf()
和fprintf()
,甚至fread()
和fwrite()
。
如果你真的坚持使用stdio,你可以在多个线程中执行阻塞IO,但这不值得这么麻烦(并且潜在的系统过载)。使用多路 IO 的唯一明智的方法是使用低级读取操作来读取数据,然后使用 stdio 工具(例如
sscanf
)来解析它。