这是我的循环代码
#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
,如何使其工作?
这是缓冲的效果。 在UNIX中,默认情况下, stdout
是行缓冲的,这意味着stdio
工具会累积字节,直到某个缓冲区被填充或遇到'\n'
。 这有利于限制I / O从而提高性能(I / O较慢)。
由于这个原因,改变你的ruby代码在最后打印一个新行'\n'
而不是回车'\r'
(因为fgets(3)
是用于行)。 你不需要改变C代码,因为fgets(3)
不会篡改换行符。
Ruby解释器对待stdout
是一样的,除非它是一个管道。 如果是这样的话,它是完全缓冲的。 解决这个问题的最简单的方法是在每次写ruby脚本之后进行STDOUT.flush
。