使用exec和fileevent来维护子进程

时间:2017-01-12 06:22:07

标签: tcl exec

我有TCL脚本的工作。 在主脚本中,我可以通过使用exec来调用新脚本

set AAA [exec tclsh "scriptA.tcl"]

我可以按Enter键终止子进程以终止进程。

fileevent stdin readable killproc 
vwait state

现在我想让它自动杀死对应的进程,如果我的话 子进程在功能上完成并保持按下进入kill proc 工作,如何通过不使用openbgexec来实现,谢谢

1 个答案:

答案 0 :(得分:0)

当你做第一个时:

set AAA [exec tclsh "scriptA.tcl"]

在子进程完成之前,您放置该语句的Tcl程序(或至少是该程序中的当前线程)不会继续。 Tcl停下来等待它。

另一种选择(不使用openbgexec)是将&作为最后一个参数:

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包。