TCL:使用同一文件中的新进程运行proc

时间:2017-08-06 07:40:13

标签: tcl exec proc

我试图用新进程运行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但它没有用 我试过谷歌搜索,但没有成功找到解决方案

如何让它运行?

非常感谢!

1 个答案:

答案 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,需要再做更多工作才能将命令和控制通道移动到标准之外管道,上面的东西已经足够了很多东西。