Как заставить замолчать printf, вызываемый из расширения Ruby C? - PullRequest
1 голос
/ 27 января 2012
  • Я использую гем Ruby, использующий расширение C (не вызов системы).
  • Код C делает несколько вызовов printf.
  • Я хочу отключить вывод этих вызовов.
  • Изменение STDOUT в Ruby ( пример ) или STDERR не запрещает вывод текста.

Возможно ли это сделать без изменения кода C?Если да, то как?

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Кто-то первоначально прокомментировал мой пост, предлагая использовать 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.
0 голосов
/ 27 января 2012

Возможно, что Ruby печатает на stderr вместо stdout, поэтому изменение stdout на Ruby не решит вашу проблему.
(Как stderr, так и stdout обычно переходят на консоль.)

Попробуйте перенаправить stderr. Насколько я помню, это будет: myprogram 2> /dev/null

0 голосов
/ 27 января 2012

Если у вас есть доступ к исходному коду C:

#define printf(...)

Эта форма макроса является макросом C99.

...