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

时间:2012-03-29 00:02:33

标签: tcl interpreter

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

  1. 用户类型Tcl命令
  2. 该命令将传递给Tcl_Eval进行评估
  3. 重复
  4. 但是如果用户键入'exit',这是一个有效的Tcl命令,整个事情--Tcl解释器和我的shell应用程序 - 会自动退出。

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

    非常感谢。

3 个答案:

答案 0 :(得分:8)

摆脱命令

rename exit ""

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

proc exit {args} { error "The exit command is not available in this context" }

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

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

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

namespace eval ::hidden {}
rename exit ::hidden::exit

答案 1 :(得分:1)

重命名exit命令:

rename exit __exit

proc exit {args} {
    puts -nonewline "Do you really want to exit? (y/n) "
    flush stdout
    gets stdin answer
    if {$answer == "y"} {
        __exit [lindex $args 0]
    }
}

这样,当用户输入exit时,他/她将执行您的自定义退出命令,您可以在其中执行任何您喜欢的操作。

答案 2 :(得分:0)

使用Tcl_CreateExitHandler工作正常。问题是我在处理程序实现中添加了printf,并且输出没有显示在终端上。所以我认为它还没有被调用。但是,到执行此处理程序时,不再有stdout。在应用程序上运行strace表明处理程序正在执行。

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