我有一个小的shell应用程序,它嵌入Tcl来执行一些Tcl代码集。使用Tcl_CreateInterp初始化Tcl解释器。一切都很简单:
但是如果用户键入'exit',这是一个有效的Tcl命令,整个事情--Tcl解释器和我的shell应用程序 - 会自动退出。
问:有什么方法可以捕获来自Tcl解释器的退出信号。我真的不想检查每个用户命令。我试过了Tcl_CreateExitHandler,但它没有用。非常感谢。
答案 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并在那里处理退出事件。