tcl中有没有办法用命令的进程替换tcl进程?
Is there a way in tcl to replace the tcl process with the process of a command?
我想在 sh
或 execve(2)
中做相当于 exec
的操作,只是将控制权从 tcl 转移到调用的命令而不是 return,所以发送到曾经是 tcl 进程的任何信号都直接发送到被调用命令,被调用命令的标准输出是曾经是 tcl 进程的标准输出,等等
我查阅了手册,但没有找到在 tcl 中执行此操作的明显方法。
我不是在谈论 tcl 的 exec
,它保留 tcl 运行,创建一个子进程并捕获其输出,然后恢复 tcl 进程中的控制流。
目前 Tcl 本身没有内置任何东西,但 TclX extension includes a command, execl
可以完全满足您的需求。
package require TclX
execl /bin/bash [list -c somescript.sh]
请注意,执行失败的 execl
可能会使进程处于不一致状态,因为某些库使用挂钩来检测底层系统调用并关闭其资源。当然,这完全取决于您在做什么,但是由于 X11 库是这方面的一个显着示例,如果 execl
失败,Tk 应用程序继续当前进程是不安全的。 (fork
/execl
习语——或者 Tcl 的标准 exec
——没有问题,因为问题系统调用总是发生在子进程中。)
我想在 sh
或 execve(2)
中做相当于 exec
的操作,只是将控制权从 tcl 转移到调用的命令而不是 return,所以发送到曾经是 tcl 进程的任何信号都直接发送到被调用命令,被调用命令的标准输出是曾经是 tcl 进程的标准输出,等等
我查阅了手册,但没有找到在 tcl 中执行此操作的明显方法。
我不是在谈论 tcl 的 exec
,它保留 tcl 运行,创建一个子进程并捕获其输出,然后恢复 tcl 进程中的控制流。
目前 Tcl 本身没有内置任何东西,但 TclX extension includes a command, execl
可以完全满足您的需求。
package require TclX
execl /bin/bash [list -c somescript.sh]
请注意,执行失败的 execl
可能会使进程处于不一致状态,因为某些库使用挂钩来检测底层系统调用并关闭其资源。当然,这完全取决于您在做什么,但是由于 X11 库是这方面的一个显着示例,如果 execl
失败,Tk 应用程序继续当前进程是不安全的。 (fork
/execl
习语——或者 Tcl 的标准 exec
——没有问题,因为问题系统调用总是发生在子进程中。)