我通过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
答案 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
内生成输出。