【问题标题】:C stdio unbuffered multiplexingC stdio 无缓冲多路复用
【发布时间】:2012-02-13 04:21:58
【问题描述】:

我正在开发一个小程序,该程序需要非常紧密地管道二进制流(无缓冲)。它必须依赖select() 多路复用,并且永远不允许“保留现有输入,除非有更多输入到达,因为这还不值得”。

使用系统调用是可能的,但话又说回来,为了方便起见,我想使用 stdio(也涉及字符串格式)。

  • 只要我使用无缓冲的标准输入输出,我能否安全地在流的底层文件描述符上使用select()?如果不是,我如何确定不会从集合中阻塞的 FILE 流?
  • 除了逐字符函数(getchar() 和朋友)之外,是否有任何调用将所有输入从 libc 传输到应用程序?

【问题讨论】:

    标签: c


    【解决方案1】:

    虽然我不完全清楚它是否受到标准的认可,但在 fileno(f) 上使用 select 应该在 f 没有缓冲时实际工作。但是请记住,无缓冲的 stdio 可能会表现得非常糟糕,并且除了在使用流之前的第一个操作之外,您不得更改缓冲。

    如果您唯一关心的是能否进行格式化输出,那么新标准化的 POSIX-2008 dprintf(和 vdprintf)函数可能是解决您问题的更好方法。

    【讨论】:

    • +1 这似乎是一个很好的答案(感谢 dprintf,我知道它一定存在!)。任何人都可以打败它?
    • 如果dprintf() et al 在您需要它们可用的任何地方都可供您使用,那将很难被击败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2012-02-16
    相关资源
    最近更新 更多