如何捕获循环代码输出

时间:2016-02-29 08:03:39

标签: c ruby linux

这是我的循环代码

#exe2.rb
loop do
  print "#{::Time.now}\r"
  sleep 1
end

我使用以下c来捕获它:

fp = popen("ruby /home/roroco/Dropbox/rbs/ro_cmds/exe2.rb", "r");
while (fgets(var, sizeof(var), fp) != NULL) {
    printf("%s", var);
}

但它停留在fgets,如何让它发挥作用?

1 个答案:

答案 0 :(得分:3)

这是缓冲的效果。在UNIX stdout默认情况下是行缓冲的,这意味着stdio工具会累积字节,直到某些缓冲区填充或遇到'\n'。这有利于限制I / O,从而提高性能(I / O很慢)。

出于这个原因,更改ruby代码以在末尾打印换行'\n'而不是回车'\r'(因为fgets(3)用于行)。您不需要更改C代码,因为fgets(3)没有更新换行符。

Ruby解释器同样对待stdout,除非它是管道。如果是这样的话,那就完全缓冲了。解决这个问题的最简单方法是在每次写入ruby脚本后执行STDOUT.flush