我正在尝试并行执行两个过程。帮助我编写tcl中的代码,该代码在TCL中同步执行两个进程。
答案 0 :(得分:2)
在Tcl中,有两种方法可以“同时”运行一对子进程。
如果您只想一次触发两个进程而不对其进行任何控制,请将&符号(&
)作为exec
的最后一个参数:
exec process1 "foo.txt" &
exec process2 "bar.txt" &
请注意,除了进程ID(由exec
返回)之外,您根本无法控制这些子进程。一旦你设置它们,你基本上再也不会听到它们了(使用适当的重定向到/从标准输入/输出可能是明智的!)
要在后台运行子进程时保持对子进程的控制,请使其在使用open
创建的管道中运行。这样做的语法相当奇怪;请务必遵循完全(除非如下所述):
set pipelineChannel1 [open |[list process1 "foo.txt" ] "r"]
set pipelineChannel2 [open |[list process2 "bar.txt" ] "r"]
这些是阅读器管道,你正在消耗子进程的输出;这就是(可选)r
的含义。要获取您写入的管道(即,您提供输入),请改用w
,如果您想两者读写,请使用r+
。然后,管道只是您与puts
,gets
,read
,fconfigure
等使用的正常渠道。完成后只需close
。
|
必须在[list …]
之前和之前。fconfigure $channel -blocking 0
。这很重要,如果命令的名称(可能是完整路径名)中包含任何Tcl元字符,并且因为specification of open
说明了这一点:
如果 fileName 的第一个字符是“ | ”,那么 fileName 的其余字符将被视为描述a的参数列表要调用的命令管道,其格式与 exec 。
的参数相同
使用管道时要注意的主要事项是。
如果您正在与子进程进行真正复杂的异步交互,请考虑使用Tcl 8.6,其中有基于协同程序功能构建的Tcllib包,可以更容易地跟踪发生的事情。