处理嵌入式Tcl运行时执行的退出命令

ily*_*725 5 interpreter tcl

我有一个小的shell应用程序,它嵌入了Tcl来执行一些Tcl代码.使用Tcl_CreateInterp初始化Tcl解释器.一切都很简单:

  1. 用户类型Tcl命令
  2. 该命令将传递给Tcl_Eval进行评估
  3. 重复

但是如果用户键入'exit',这是一个有效的Tcl命令,整个事情--Tcl解释器和我的shell应用程序 - 会自动退出.

问:有什么方法可以捕获来自Tcl解释器的退出信号.我真的不想检查每个用户命令.我尝试了Tcl_CreateExitHandler,但它没有用.

非常感谢.

RHS*_*ger 8

摆脱命令

rename exit ""
Run Code Online (Sandbox Code Playgroud)

或者重新定义它以让用户知道它被禁用:

proc exit {args} { error "The exit command is not available in this context" }
Run Code Online (Sandbox Code Playgroud)

另外值得考虑的是在安全的interp中而不是在主shell中运行用户的代码.这样做可以让您准确控制用户有权访问的内容.

您也可以创建子interp(非安全),并且只禁用该interp的exit命令.

最后,如果您只是试图避免用户错误地输入它,您可以将exit重命名为其他内容:

namespace eval ::hidden {}
rename exit ::hidden::exit
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望退出,而不是用户,我建议您使用安全的间隔路线. (4认同)
  • +1安全interp几乎肯定是要走的路 (2认同)

ily*_*725 0

使用Tcl_CreateExitHandler效果很好。问题是我printf在处理程序实现中添加了 a ,但输出没有显示在终端上。所以我认为它还没有被调用。然而,当这个处理程序被执行时,已经没有了stdout。在应用程序上运行strace表明处理程序正在正常执行。

此问题的另一个解决方案是使用atexit并在那里处理退出事件。