【问题标题】:Is it possible to implement printf() in a non blocking manner in linux terminal是否可以在linux终端中以非阻塞方式实现printf()
【发布时间】:2016-10-01 22:25:08
【问题描述】:

睡眠 1 秒后我有一个 printf 语句。由于 printf 语句耗时超过 1 秒,因此刷新率超过 2 秒。这是我正在谈论的一个例子:

while(1){
   printf("%s",buf);//Takes more than one second to print a table. Only few          
                    //values are updated
   sleep(1);
}

我怎样才能让 printf 成为非阻塞的。在标准的 linux 机器中有没有办法?

-萨纳坦

【问题讨论】:

  • printf(...) ; flush(buf); ? (多年来没有这样做,但请搜索正确使用 flush()。(或 fflush()?)祝你好运。
  • @shellter 单独的 fflush() 如何解决他的问题?它不会更快并且仍然会阻塞。
  • @jforberg :正如我所说,“多年来没有这样做过”,这不是我将其描述为一个完美的书面问题,所以我只是提供一些尝试,直到得到答案专家出现了(有时他们没有出现)。其他人似乎同意这值得一试。如果它解决了 O.P.s 问题,将很乐意为下面的答案投票。祝大家好运。
  • @shellter 很公平,没有冒犯的意思。

标签: c linux printing terminal


【解决方案1】:

如果您只关心屏幕上显示的内容,那是 curses 解决的问题之一。使用 curses,您可以使用合理的最佳输出更新显示(仅更新更改的区域,而不是每次打印整个表格),并且使用 typeahead 功能,您可以缓解更新落后的问题太快了。

它比printf 更复杂。但是使用printf,缓冲区将被填满,除了标准输出外无处可放。在某些实现中,您可以使用setvbuf 分配一个新的输出缓冲区,但POSIX 在输出开始后对此不以为然,saying

setvbuf() 函数可以在流指向的流与打开的文件关联之后使用,但任何其他操作之前(不成功调用setvbuf()) 在流上执行。

正因为如此,ncurses 谨慎对待setvbuf(以及类似的函数,如setbuf)。在当前版本中,为解决其他问题,ncurses 不再使用此功能。但它是still documented

ncurses 在终端初始化期间启用缓冲输出。出于性能原因,这样做(如在 SVr4 诅咒中)。出于测试目的,ncurses 和 在某些应用程序中,此功能是可选的。 设置 NCURSES_NO_SETBUF 变量禁用输出 缓冲,将输出保留在原始文件中(通常 行缓冲)模式。

【讨论】:

  • 我正要发布一个关于 ncurses 的答案,这里是维护者自己打败我的 :) 这是一个小型互联网。
  • 感谢您的建议。它与使用另一个专门用于执行 printf 操作的线程相比如何。
  • printf 可能会落后并且缓冲区已满 :-)
  • 谢谢!我会找一个例子来试试。
【解决方案2】:

函数 printf 是一个缓冲函数。它仅在缓冲区已满或强制执行时刷新到标准输出。如果你打印一个 \n 这将填满缓冲区。你可以做的是使用 stdout 上的 fflush 函数来强制它。

【讨论】:

  • 我不明白这与问题有什么关系。虽然不清楚,但这个问题根本没有提到缓冲,这似乎不是他的问题。
猜你喜欢
  • 2017-11-12
  • 2014-11-01
  • 1970-01-01
  • 2013-09-03
  • 2019-09-27
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
相关资源
最近更新 更多