我有TCL脚本的工作。 在主脚本中,我可以通过使用exec来调用新脚本
set AAA [exec tclsh "scriptA.tcl"]
我可以按Enter键终止子进程以终止进程。
fileevent stdin readable killproc
vwait state
现在我想让它自动杀死对应的进程,如果我的话
子进程在功能上完成并保持按下进入kill proc
工作,如何通过不使用open
或bgexec
来实现,谢谢
答案 0 :(得分:0)
当你做第一个时:
set AAA [exec tclsh "scriptA.tcl"]
在子进程完成之前,您放置该语句的Tcl程序(或至少是该程序中的当前线程)不会继续。 Tcl停下来等待它。
另一种选择(不使用open
或bgexec
)是将&
作为最后一个参数:
set AAA [exec tclsh "scriptA.tcl" &]
但是,在这种情况下,子进程在后台启动,并且与主进程没有真正的连接,后者会立即继续。在这种情况下,AAA
变量不包含程序的输出,而是包含子进程的进程ID;您可以将该ID与平台的常用系统工具一起使用来监控它。 (许多unix允许你查看/proc/$processID
以查找有关正在运行的进程的信息。虽然不是全部,但它没有标准化,并且该目录的内容确实未标准化。还可以查看TclX包提供的工具;其中一些可以使用进程ID,前提是您知道如何使用它包装的POSIX系统调用。)
在Tcl 8.6中,我们添加了用于监视和处理子进程的其他选项:您可以使用chan pipe
创建一个真正的OS理解的单向原始未命名管道(它连接到一对通道),并且可以关闭只使用close
的额外参数的双向通道的一端。这使得您可以执行诸如使用fileevent
来监视子进程的操作,即使您使用exec
进行操作也是如此,但在此时使用open
并不是那么简单。 exec
命令支持将通道直接连接到子进程,但目前仅适用于具有与之关联的实际操作系统句柄的通道(管道,是;套接字,是;终端,是;文件,是;精心制作的脚本驱动通道与chan create
,不)。
一般来说,我们建议您保持简单:
exec …
用于何时运行子流程并立即等待结果。open |[list …]
用于何时在后台运行子流程并与之交互(或bgexec
,它为相同的功能提供略有不同的界面)。请记住,Tcl的fileevent
与管道,终端以及套接字一起工作。exec … &
用于何时在后台运行子流程并完全放弃对其的控制。在真正的复杂案例中,有Expect包。