如何在Ruby C扩展中调用printf?

时间:2012-01-26 23:24:24

标签: c ruby printf stdout

  • 我正在运行一个Ruby gem,它依赖于C扩展(不是对系统的调用)。
  • C代码多次调用printf。
  • 我想让这些电话的输出无声。
  • 更改Ruby的STDOUT(example)或STDERR不会阻止输出文本。

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

3 个答案:

答案 0 :(得分:4)

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

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

用法:

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

答案 1 :(得分:0)

如果您有权访问C源代码:

#define printf(...)

此宏窗体是C99可变参数宏。

答案 2 :(得分:0)

Ruby可能会打印到stderr而不是stdout,这就是为什么更改Ruby的stdout无法解决您的问题。
stderrstdout通常都会转到控制台。)

尝试重定向stderr。我记得它是:myprogram 2> /dev/null