由嵌入式Tcl运行时执行的Handle exit命令

由嵌入式Tcl运行时执行的Handle exit命令,tcl,interpreter,Tcl,Interpreter,我有一个小型shell应用程序,可以嵌入它来执行一些Tcl代码集。Tcl解释器是使用Tcl_CreateInterp初始化的。一切都很简单: 用户类型Tcl命令 命令被传递给Tcl_Eval进行评估 重复 但是如果用户键入“exit”,这是一个有效的Tcl命令,那么整个过程——Tcl解释器和我的shell应用程序——将自动退出 问:有没有办法捕捉到来自Tcl解释器的退出信号。我真的不想检查每个用户命令。我试过了,但没用 非常感谢。摆脱这个命令 rename exit "" 或者重新定义它,让用

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

  • 用户类型Tcl命令
  • 命令被传递给Tcl_Eval进行评估
  • 重复
  • 但是如果用户键入“exit”,这是一个有效的Tcl命令,那么整个过程——Tcl解释器和我的shell应用程序——将自动退出

    问:有没有办法捕捉到来自Tcl解释器的退出信号。我真的不想检查每个用户命令。我试过了,但没用

    非常感谢。

    摆脱这个命令

    rename exit ""
    
    或者重新定义它,让用户知道它已被禁用:

    proc exit {args} { error "The exit command is not available in this context" }
    
    同样值得考虑的是,在一个shell中而不是在主shell中运行用户代码。这样做将允许您准确地控制用户有权访问的内容

    您还可以创建一个子interp(非安全)并仅禁用该interp的exit命令

    最后,如果您只是想避免用户错误地键入,您可以将exit重命名为其他名称:

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

    重命名
    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
    时,他/她将执行您的自定义exit命令,您可以在其中执行任何您喜欢的操作。

    使用
    Tcl\u CreateExitHandler
    工作正常。问题是我在处理程序实现中添加了一个
    printf
    ,而输出没有显示在终端上。所以我想它还没被叫来。但是,在执行此处理程序时,不再有
    stdout
    。在应用程序上运行
    strace
    表明处理程序执行得很好


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

    这是可行的。但我仍然希望保留“退出”呼叫。如果您希望退出对您可用,但对用户不可用,我建议使用安全的interp路由。@jk。总的来说,我同意这一点。显而易见的警告是,他可能想让用户拥有Tcl外壳的全部功能,但不想让用户意外退出程序。很难从这个问题上判断这是真是假。是的,最后一点是肯定的:我不想限制用户的输入。有什么方法可以在自定义退出过程中发送ctrl+D信号吗?为什么需要在自定义退出过程中发送ctrl+D?如果您将退出命令“移开”(通过重命名),您仍然可以调用它。修复了标题并删除了对“tcllib”的引用,因为它是一个标准化的Tcl库。您似乎真正指的是将Tcl运行时嵌入到您的程序中。
    Tcl_CreateExitHandler
    用于捕获出口和释放资源(例如,数据库连接),否则这些资源就会被挂起。它不能阻止退出的发生。这正是我想要做的——在退出时释放资源。为什么Tcl_CreateExitHandler在这种情况下不起作用?谢谢,Hai。然而,这仍然不能解决我的问题-如果从Tcl调用
    exit
    ,我的整个C应用程序将无条件关闭。我仍然需要在退出时清理一些资源。