如何在Ruby中更改FFI调用的标准输出?

3

我通过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个回答

1

AllocTilts.summary如何写入标准输出?如果它使用了 printf,而且您无法访问其源代码,则除了调用libc的 dup之外,您无能为力。

Ruby写入$stdout的方式是绕过真正的标准输出。

# from io.c

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

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


你能详细介绍一下 dup 吗? - Translunar
你可以使用dup命令将标准输出重定向到你创建的另一个文件描述符,然后从新文件描述符重定向到Ruby的$stdout。你可以在https://dev59.com/D3E85IYBdhLWcg3wzW3M阅读关于`dup`和标准输出重定向的更多信息。 - gioele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接