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

标签 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

最佳答案

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

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

# from io.c

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

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

关于ruby - 如何更改 Ruby 中 FFI 调用的 STDOUT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138964/

相关文章:

ruby - 如何使用 Mechanize 读取每个 HTML 标签的内容?

ruby - 我的 Assets 是否由 AWS S3 提供服务

使用数组参数从 C 调用 Rust 方法

c - luajit ffi 实现 block 终结器

berkeley-db - 将 Rust 与 Berkeley DB 连接起来

ruby-on-rails - Rails - 如何对嵌套记录使用 TRY

ruby - 在 Ruby 中迭代数组时如何修改它?

ruby-on-rails - Restful 命令

racket - 使用 Racket FFI 在 PortAudio 中注册回调会导致段错误

c - unsafePerformIO 和 FFI 库初始化