使用exec和fileevent维护子进程

Using exec and fileevent to maintain subprocess

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

set AAA [exec tclsh "scriptA.tcl"]

我可以通过按回车键终止子进程。

fileevent stdin readable killproc 
vwait state

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

当你做第一个时:

set AAA [exec tclsh "scriptA.tcl"]

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

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

set AAA [exec tclsh "scriptA.tcl" &]

但是,在这种情况下,子进程在后台启动,与主进程没有真正的连接,主进程会立即继续。在这种情况下,AAA 变量不会包含程序的输出,而是包含子进程的进程 ID;您可以将该 ID 与您平台的常用系统工具一起使用来监控它。 (许多 unix 让您查看 /proc/$processID 以查找有关 运行ning 进程的信息。虽然不是全部;它没有标准化,并且该目录的内容 确实 未标准化。您还可以查看 TclX 包提供的工具;其中一些工具可以使用进程 ID,前提是您知道如何使用它包装的 POSIX 系统调用。)

在 Tcl 8.6 中,我们添加了其他用于监视和处理子进程的选项:您可以使用 chan pipe 制作真正的 OS-understood 单向原始未命名管道(它连接到一对通道) ,并且可以使用 close 的额外参数仅关闭双向通道的一端。这让你可以做一些事情,比如使用 fileevent 来监视子进程,即使你使用 exec,但在这一点上它并不比使用 open 简单多少。 exec 命令支持直接将通道连接到子进程,但目前仅适用于具有与其关联的真实 OS 句柄的通道(管道,是;套接字,是;终端,是;文件,是;详述 script-driven 使用 chan create 创建的频道,否)。


一般来说,我们建议您保持简单:

  • exec … 用于当您想要 运行 子进程并立即等待结果时。
  • open |[list …] 当你想在后台 运行 一个子进程并与之交互时(或 bgexec,它为相同的功能提供了一个稍微不同的接口)。请记住,Tcl 的 fileevent 与管道和终端以及套接字一起工作
  • exec … & 用于当您想要 运行 子进程在后台并完全放弃对它的控制时。

真正复杂的情况下,还有 Expect 包。