Tcl中重定向标准输出stdout

风行水上 @ 2013-01-21 16:03:35
标签:

答案其实很简单

close stdout
open $file "w" ;# Now, stdout is redirected to $file
puts hello

close stdout
open /dev/tty  ;# Now, stdout recover to default
puts hello

而背后的道理可以参见 Tcl_StandardChannels

简单概括一下如下。

stdin/stdout/stderr 的初始化

  1. 显式调用 Tcl_SetStdChannel
  2. 试图访问channel信息时,设置为系统默认值
    • 比如 Tcl_GetChannelNames、Tcl_GetStdChannel、Tcl_GetChannel、file channels等
    • 系统默认值缺失时,认为是已经初始化并随即立即关闭。从而随后打开的channel被设置为standard channels
  3. 调用Tcl_RegisterChannel时,设置为系统默认值。
    • 系统默认值缺失时,设置为随后打开的三个channel

当stdin/stdout/stderr被关闭(close)后,再次调用Tcl_CreateChannel时会按照stdin、stdout、stderr的顺序初始化standard channes。这就是开始的代码可以工作的原因。

标签:

分享到:
comments powered by Disqus

27/32ms