2012-02-13 59 views
3

我正在研究一个需要非常密切地(非缓冲)管道二进制流的小程序。它必须依赖select()多路复用,并且决不允许“保留现有输入,除非有更多输入已经到达,因为它现在还不值得”。C stdio无缓冲复用

这是可能的使用系统调用,但是,然后再次,我想使用stdio方便(也涉及字符串格式)。

  • 只要我使用无缓冲的stdio,我可以安全地在流的底层文件描述符上使用select()吗?如果不是,我怎样才能确定一个文件流,不会阻止一组?
  • 除了char-by-char函数(getchar()和朋友)之外,是否有任何调用将所有输入从libc传输到应用程序?

回答

2

虽然我不是不管它是由标准的认可,使用selectfileno(f)应在工作实践中完全清楚时f无缓冲。请记住,无缓冲的stdio可以执行病态的恶意,并且您不允许更改缓冲,除非您在使用流之前的第一个操作。

如果您唯一担心的是能够执行格式化输出,则POSIX-2008 dprintf(和vdprintf)中的新标准功能可能是您的问题的更好解决方案。

+0

+1这似乎是一个非常好的答案(并感谢dprintf,我知道它必须存在!)。任何人都可以击败? – 2012-02-13 04:55:46

+0

如果你需要它们的地方都可以使用它,将很难击败'dprintf()'等。 – 2012-02-13 05:01:44