如何在Ruby中更改FFI调用的STDOUT?

时间:2012-02-04 06:41:43

标签: ruby ffi

我通过FFI访问Ruby中的C函数。该函数称为AllocTilts::summary

我希望该方法不会向STDOUT打印任何内容。但是我的STDOUT临时重定向不起作用。还有什么我可以做的吗?

puts 'test outside before' #prints successfully
File.open("/var/alloc_tilts/summary_dump", "w") do |out|
  stdout, $stdout = $stdout, out
  puts 'test inside' #doesn't print to STDOUT as expected
  AllocTilts.summary(2012, 2011) #prints undesired stuff to STDOUT
  $stdout = stdout
end
puts 'test outside after' #prints successfully

1 个答案:

答案 0 :(得分:1)

AllocTilts.summary如何写入stdout?如果它使用printf并且您无法访问其源代码,则无法执行任何操作(除了调用libc dup)。

ruby​​写入$stdout而不是真正的stdout的方式是

# from io.c

rb_funcall2(rb_stdout, rb_intern("puts"), argc, argv);

您应该使用类似的代码在AllocTilts.summary内生成输出。