如何使从Ruby C扩展中调用的printf静音?

use*_*029 1 c ruby printf stdout

  • 我正在运行一个依赖于C扩展(而不是对系统的调用)的Ruby gem。
  • C代码对printf进行了多次调用。
  • 我想使这些呼叫的输出静音。
  • 更改Ruby的STDOUT(示例)或STDERR不会阻止文本的输出。

是否可以在不修改C代码的情况下执行此操作?如果是这样,怎么办?

use*_*029 5

最初有人评论我的帖子,建议使用IO.reopen。这对我有用。不幸的是,此人删除了他/她的评论,因此我将发布最后使用的更详细的功能:

def silence_stdout(log = '/dev/null')
  old = $stdout.dup
  $stdout.reopen(File.new(log, 'w'))
  yield
  $stdout = old
end
Run Code Online (Sandbox Code Playgroud)

用法:

silence_stdout { foo }              # Won't be displayed, won't be logged.
silence_stdout('log.txt') { bar }   # Won't be displayed, logged in log.txt.
Run Code Online (Sandbox Code Playgroud)