Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使从Ruby C扩展中调用的printf静音? 我正在运行一个RubyGem,它依赖于C扩展(不是对系统的调用) C代码多次调用printf 我想使这些调用的输出静音 更改Ruby的STDOUT()或STDERR不会阻止文本输出_C_Ruby_Printf_Stdout - Fatal编程技术网

如何使从Ruby C扩展中调用的printf静音? 我正在运行一个RubyGem,它依赖于C扩展(不是对系统的调用) C代码多次调用printf 我想使这些调用的输出静音 更改Ruby的STDOUT()或STDERR不会阻止文本输出

如何使从Ruby C扩展中调用的printf静音? 我正在运行一个RubyGem,它依赖于C扩展(不是对系统的调用) C代码多次调用printf 我想使这些调用的输出静音 更改Ruby的STDOUT()或STDERR不会阻止文本输出,c,ruby,printf,stdout,C,Ruby,Printf,Stdout,是否可以在不修改C代码的情况下执行此操作?如果是,如何操作?如果您可以访问C源代码: #define printf(...) 此宏窗体是C99可变宏。如果您可以访问C源代码: #define printf(...) 此宏窗体是C99可变宏。可能Ruby正在打印到stderr而不是stdout,这就是为什么更改Ruby的stdout并不能解决问题的原因。 (通常,stderr和stdout都会转到控制台。) 尝试重定向stderr。我记得它是:myprogram 2>/dev/null可能R

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

如果您可以访问C源代码:

#define printf(...)

此宏窗体是C99可变宏。

如果您可以访问C源代码:

#define printf(...)

此宏窗体是C99可变宏。

可能Ruby正在打印到
stderr
而不是
stdout
,这就是为什么更改Ruby的
stdout
并不能解决问题的原因。
(通常,
stderr
stdout
都会转到控制台。)
尝试重定向
stderr
。我记得它是:
myprogram 2>/dev/null
可能Ruby正在打印到
stderr
,而不是
stdout
,这就是为什么更改Ruby的
stdout
并不能解决问题的原因。
(通常,
stderr
stdout
都会转到控制台。)
尝试重定向
stderr
。我记得应该是:
myprogram2>/dev/null

最初有人在我的帖子上建议使用。这对我有用。不幸的是,此人删除了自己的评论,因此我将发布我最后使用的更详细的功能:

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.

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

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.

我记得以前找不到这样做的方法。在运行程序时,哪个命令后缀为“2>/dev/null”和“>/dev/null”可以使有问题的
printf
s静音?另外,它是哪个扩展?如果在运行
ruby
时重定向
stdout
stderr
是不够的,那么gem中一定有什么特别的事情。我们得看看消息来源才能知道。似乎他们不太可能直接打开
/dev/tty
来绕过
stdout/stderr
,但如果他们没有从ruby继承stdio,我只能想到这一点。@WayneConrad,运行ruby script.rb>/dev/null会使输出静音,而>2/dev/null则不会。@BenJackson,所讨论的宝石是lda ruby,v。0.3.8. 有问题的行位于ext/lda alpha.c的第64行,它的内容是
printf(“alpha最大化:%5.5f%5.5f\n”,f,df)。将“tty”和“dev”的源代码进行灰色化不会产生任何结果。我记得过去没有找到这样做的方法。在运行程序时,哪个命令后缀为“2>/dev/null”和“>/dev/null”会使有问题的
printf
s静音?另外,它是哪个扩展?如果在运行
ruby
时重定向
stdout
stderr
是不够的,那么gem中一定有什么特别的事情。我们得看看消息来源才能知道。似乎他们不太可能直接打开
/dev/tty
来绕过
stdout/stderr
,但如果他们没有从ruby继承stdio,我只能想到这一点。@WayneConrad,运行ruby script.rb>/dev/null会使输出静音,而>2/dev/null则不会。@BenJackson,所讨论的宝石是lda ruby,v。0.3.8. 有问题的行位于ext/lda alpha.c的第64行,它的内容是
printf(“alpha最大化:%5.5f%5.5f\n”,f,df)。将“tty”和“dev”的源代码进行灰色化不会产生任何结果。我没有想到这一点,但不幸的是这也失败了。我没有想到这一点,但不幸的是这也失败了。请注意,在Windows上/dev/null应该改为NUL。是否可以保存为字符串,不是文件?请注意,Windows上的/dev/null应更改为NUL。是否可以保存为字符串而不是文件?