我当前任务的主要问题是从Tcl环境(使用exec cmd。)启动进程,I / O重定向到父进程(Tcl),当父进程意外停止时,我想自动停止子进程。但有一点需要注意:对于I / O重定向案例,子进程不会停止。问题很复杂,因为无法修改子进程。
我找到了下一个线程How to make child process die after parent exits?,其中找到了C语言的解决方案,没有I / O重定向。
例如,我在Tcl中使用下一个命令:
exec ping $SERVER_NAME >@ stdout 2>@ stderr
此命令将stdout和stderr的输出重定向到父进程(Tcl)。 但我需要运行类似的东西:
exec sh -c "set -o monitor; ping $SERVER_NAME >@ stdout 2>@ & read dummy; kill %1"
在上面的命令中,stdout和stderr的输出进入“sh”进程,但我想在我的父进程中得到它。所以我有几个问题:
答案 0 :(得分:0)
>@ stdout
的含义是将命令的输出发送到Tcl进程的标准输出而不收集它。 2>@ stderr
的含义是将命令的标准错误流发送到Tcl进程的标准错误而不收集它(如果它收集了非空的东西,则会导致错误)。考虑在子进程调用中复制它,即使在bash中,也会让我受伤!我怀疑你不能这样做。
这样处理可能更容易:
set pid [exec exec ping $SERVER_NAME >@ stdout 2>@ stderr &]
# and when you want to stop it...
exec kill $pid
执行更完整的工作需要使用TclX软件包的signal
命令。