我正在开发一个需要非常紧密地(无缓冲)传输二进制流的小程序。它必须依赖于 select()
多路复用,并且永远不允许“保留现有输入,除非有更多输入,因为这还不值得”。
可以使用系统调用,但话又说回来,为了方便起见,我想使用 stdio(也涉及字符串格式化)。
- 只要我使用无缓冲的 stdio,我可以安全地在流的底层文件描述符上使用
select()
吗?如果不是,我如何确定不会从集合中阻塞的 FILE 流? - 除了 char-by-char 函数(
getchar()
和 friend )之外,是否有任何调用将所有输入从 libc 传输到应用程序?
最佳答案
虽然我不完全清楚它是否被标准认可,但使用 select
在 fileno(f)
应该在实践中工作 f
是无缓冲的。但请记住,无缓冲的 stdio 可能会在病态上表现不佳,并且不允许更改缓冲,除非是在使用流之前的第一个操作。
如果您唯一关心的是能够进行格式化输出,那么新标准化的 POSIX-2008 dprintf
(和 vdprintf
)函数可能是解决您问题的更好方法。
关于C stdio 无缓冲多路复用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255572/