我试图用新进程运行proc 我试图从main函数调用proc1和proc2,但每个都应该使用新进程(或子进程)单独运行,并等待它完成
proc main { var } {
puts "main function with var: $var"
#call proc1 with new process
exec proc1 1
#wait till proc1 finish
#call proc2 with new process
exec proc2 2
#wait till proc2 finish
puts "Finished"
}
proc proc1 { var1 } {
puts "proc1 function with var: $var1"
}
proc proc2 { var2 } {
puts "proc2 function with var: $var2"
}
我尝试使用exec但它没有用 我试过谷歌搜索,但没有成功找到解决方案
如何让它运行?
非常感谢!
答案 0 :(得分:0)
最简单的机制是将程序放在一个单独的文件(例如myprocs.tcl
)中,并在文件的 end 处添加以下额外代码:
# Take a command from stdin, evaluate it, and write result to stdout
puts [eval [read stdin]]
然后使用以下助手调用这些过程:
proc runproc {procname args} {
exec [info nameofexecutable] myprocs.tcl << [list $procname {*}$args] 2>@stderr
}
# Demonstrating
set result [runproc proc1 1]
然而,上述并不是最强大的机制。特别是,如果您的程序中存在错误,那么事情会非常糟糕。如果您将过程更改为return
他们的结果而不是puts
,那么这是一个非常强大的机制,非常有效:
被叫方:
set cmd [read stdin]
catch $cmd msg opts
puts [list $msg $opts]
exit
来电方:
proc runproc {procname args} {
set cmd [list $procname {*}$args]
set pair [exec [info nameofexecutable] myprocs.tcl << $cmd 2>@stderr]
lassign $pair msg opts
return -options $opts $msg
}
同时传输正常stdout
或允许子进程访问调用者的stdin
,需要再做更多工作才能将命令和控制通道移动到标准之外管道,上面的东西已经足够了很多东西。