这是我的循环代码
#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
。