Tcl脚本之间的通信

时间:2017-10-31 11:15:44

标签: tcl exec tk

我成功地使用以下方法重定向我的GUI(tcl / tk)调用的脚本的标准输出: exec [info nameofexecutable] jtag.tcl >@$file_id

Here's a description of my system. 现在我希望能够告诉jtag.tcl停止数据采集(这是一个无限循环)当我点击"停止"按钮。可以通过exec或者我应该使用open吗?

1 个答案:

答案 0 :(得分:1)

exec命令等待子进程完成后再将控制权返回给您(除非您在后台完全断开连接)。要保持控制,您需要打开管道:

# Not a read pipe since output is redirected
set pipe [open |[list [info nameofexecutable] jtag.tcl >@$file_id] "w"]

您还需要确保其他进程在管道关闭时进行侦听,或者使用其他协议来告知另一端完成。最简单的机制是远程端将管道(即stdin)置于非阻塞模式,并定期检查退出消息。

# Putting the pipe into nonblocking mode
fconfigure stdin -blocking 0
# Testing for a quit message; put this in somewhere it can be called periodically
if {[gets stdin] eq "quit"} {
    exit
}

然后,子进程的关闭协议将成为父进程中的

puts $pipe "quit"
close $pipe

或者,杀死子进程并获取结果:

exec kill [pid $pipe]
# Need the catch; this will throw an error otherwise because of the signal
catch {close $pipe}