如何捕获循环代码输出

这是我的循环代码

#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