使用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
工作,我如何通过不使用 open
或 bgexec
来实现,谢谢
当你做第一个时:
set AAA [exec tclsh "scriptA.tcl"]
在子进程完成之前,您放置该语句的 Tcl 程序(或至少该程序中的当前线程)不会继续。 Tcl 停止并等待它。
另一种选择(不使用 open
或 bgexec
)是将 &
作为最后一个参数:
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 包。
我有一个TCL脚本的作品。 在主脚本中,我可以通过使用 exec 来调用新脚本
set AAA [exec tclsh "scriptA.tcl"]
我可以通过按回车键终止子进程。
fileevent stdin readable killproc
vwait state
现在我想让它自动杀死相应的进程,如果我
子进程在功能上工作以完成并保持按下 enter kill proc
工作,我如何通过不使用 open
或 bgexec
来实现,谢谢
当你做第一个时:
set AAA [exec tclsh "scriptA.tcl"]
在子进程完成之前,您放置该语句的 Tcl 程序(或至少该程序中的当前线程)不会继续。 Tcl 停止并等待它。
另一种选择(不使用 open
或 bgexec
)是将 &
作为最后一个参数:
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 包。