【问题标题】:How do I change STDOUT for FFI calls in Ruby?如何在 Ruby 中更改 FFI 调用的 STDOUT?
【发布时间】:2012-02-26 16:18:44
【问题描述】:

我正在通过 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

【问题讨论】:

    标签: ruby ffi


    【解决方案1】:

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

    ruby 写入$stdout 而不是真正的标准输出的方式是

    # from io.c
    
    rb_funcall2(rb_stdout, rb_intern("puts"), argc, argv);
    

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

    【讨论】:

    • 你能详细介绍一下dup吗?
    • 您可以使用dup 将普通标准输出重定向到您创建的另一个文件描述符,然后从该新文件描述符重定向到Ruby 的$stdout。您可以在 stackoverflow.com/questions/2605130/… 阅读有关 dup 和标准输出重定向的信息
    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2019-09-29
    相关资源
    最近更新 更多