如何在C中复用缓冲IO

  • 本文关键字:复用 缓冲 IO select
  • 更新时间 :
  • 英文 :


我正在用c编写一个简单的聊天服务器。为了从所有客户端获取传入消息,我需要使用select系统调用。我决定使用stdio函数使其更容易,但我担心库的缓冲会弄乱select的使用(即数据将保持缓冲,从fd读取但不可见)。在C中应该使用什么函数来复用缓冲I/O ?

当我写这篇文章的时候,我记得文件流可以进入无缓冲模式。这样行吗?

不幸的是,无缓冲模式不起作用。例如,fgets()将需要读取尽可能多的数据,直到读取整行(或者用户提供的缓冲区被填满)。要做到这一点,它将不止一次地调用底层read(),即使在没有缓冲的情况下也是如此,并且在第一个之后的调用将不在您的控制之下。fscanf()fprintf(),甚至fread()fwrite()也是如此。

如果您真的坚持使用stdio,您可以在多个线程中执行阻塞IO,但这并不值得麻烦(以及潜在的系统过载)。使用多路IO的唯一相同方法是使用低级读操作来读取数据,然后使用stdio工具(如sscanf)对其进行解析。

最新更新