这是我的循环代码
#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
,如何让它发挥作用?
答案 0 :(得分:3)
这是缓冲的效果。在UNIX stdout
默认情况下是行缓冲的,这意味着stdio
工具会累积字节,直到某些缓冲区填充或遇到'\n'
。这有利于限制I / O,从而提高性能(I / O很慢)。
出于这个原因,更改ruby代码以在末尾打印换行'\n'
而不是回车'\r'
(因为fgets(3)
用于行)。您不需要更改C代码,因为fgets(3)
没有更新换行符。
Ruby解释器同样对待stdout
,除非它是管道。如果是这样的话,那就完全缓冲了。解决这个问题的最简单方法是在每次写入ruby脚本后执行STDOUT.flush
。