我正在用c编写一个简单的聊天服务器。为了从所有客户端获取传入消息,我需要使用select
系统调用。我决定使用stdio
函数使其更容易,但我担心库的缓冲会弄乱select
的使用(即数据将保持缓冲,从fd读取但不可见)。在C中应该使用什么函数来复用缓冲I/O ?
不幸的是,无缓冲模式不起作用。例如,fgets()
将需要读取尽可能多的数据,直到读取整行(或者用户提供的缓冲区被填满)。要做到这一点,它将不止一次地调用底层read()
,即使在没有缓冲的情况下也是如此,并且在第一个之后的调用将不在您的控制之下。fscanf()
和fprintf()
,甚至fread()
和fwrite()
也是如此。
如果您真的坚持使用stdio,您可以在多个线程中执行阻塞IO,但这并不值得麻烦(以及潜在的系统过载)。使用多路IO的唯一相同方法是使用低级读操作来读取数据,然后使用stdio工具(如sscanf
)对其进行解析。