我当前任务的主要问题是从 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”进程,但我想将其获取到我的父进程中。所以我有几个问题:
- 以下命令中的符号“@”是什么意思(也许您可以获得链接)?
- 如何将 I/O 重定向到 Tcl 进程?
- 如果 Tcl 进程意外停止,如何停止子进程(例如 ping)?
最佳答案
>@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
命令。
关于linux - Bash I/O 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966968/