我成功地使用以下方法重定向我的GUI(tcl / tk)调用的脚本的标准输出:
exec [info nameofexecutable] jtag.tcl >@$file_id
Here's a description of my system.
现在我希望能够告诉jtag.tcl停止数据采集(这是一个无限循环)当我点击"停止"按钮。可以通过exec
或者我应该使用open
吗?
答案 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}