2015-01-15 45 views
0

我当前任务的主要问题是从Tcl环境(使用exec cmd。)和I/O重定向到父进程(Tcl)启动进程,并且父进程意外停止时,我想自动停止子进程。但是有一个警告:对于I/O重定向的情况,子进程不会停止。这个问题很复杂,因为子进程无法修改。Bash I/O重定向

我找到了下一个线程How to make child process die after parent exits?,发现了C语言和没有I/O重定向的解决方案。

因此,例如,在我的Tcl使用下一个命令:输出和错误的

exec ping $SERVER_NAME >@ stdout 2>@ stderr 

该命令重定向输出到父进程(TCL)。 但我需要运行类似的东西:

exec sh -c "set -o monitor; ping $SERVER_NAME >@ stdout 2>@ & read dummy; kill %1" 

而且在上述输出和错误的输出命令进入“sh”的过程,但我想获得它在我的父进程。所以我有几个问题:

  1. 什么意思符号“@”在下面的命令(可能是你可以得到一个链接)?
  2. 如何使I/O重定向到Tcl进程?
  3. 如何停止子进程(例如ping)如果Tcl进程意外停止?

回答

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命令。

+0

很抱歉,但 “定PID [EXEC EXEC平$ SERVER_NAME> @标准输出2> @标准错误&]” 不工作:错误:无法执行 “执行”:没有这样的文件或目录 – Alexei 2015-01-15 16:09:42

+0

@Alexei:尝试删除“执行”之一。 – 2015-01-15 17:12:25

+0

@Hoodiecrow:叶,我已经尝试过,但在这种情况下,pid变量将不会被设置,因为当我停止父进程子继续工作和exec没有返回,所以没有设置PID。我不知道这个命令可能还有其他一些错误吗? – Alexei 2015-01-15 18:42:47