我在comp.lang.tcl上发布了这个问题。
我正在开发一个Tcl/Tk
应用程序(称之为rs
),我想将stdout
和stderr
重定向到我的Tcl/Tk
应用程序中的文本框。我正在使用Memchan
来实现此目的(我将Memchan
静态链接到我的应用程序中)。但我无法将我创建的fifo
频道重命名为stderr
。 (同样的事情也适用于stdout
)
例如,在以下代码段中,我正在关闭stderr
,然后将fifo
打开为stderr
,但是fifo频道仍然被命名为fifo0
而不是stderr
}。
$ rs
rs> package require Memchan
2.3
rs> chan names
stdin stdout stderr
rs> close stderr
rs> chan names
stdin stdout
rs> set stderr [fifo]
fifo0
rs> chan names
fifo0 stdin stdout
当我输入stderr
命令的最后一个时,我期望fifo0
而不是chan names
。
但是,当我使用tclsh8.5
时,上述序列会产生预期效果,即fifo
重命名为stderr
$ tclsh8.5
% package req Memchan
2.3
% chan names
stdin stdout stderr
% close stderr
% chan names
stdin stdout
% set stderr [fifo]
fifo0
% chan names
stderr stdin stdout
注意:没有fifo0
,但我们得到了所需的stderr
。
有人可以在我的tclsh8.5
申请Tcl/Tk
中指出如何重现rs
中的行为。
答案 0 :(得分:1)
由于memchan不会产生由文件描述符备份的通道,因此它无法替换标准通道(总是对应于FD 0,1和2)。