这是我的循环代码

#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

10-04 21:38
查看更多