在ghci中使用:quit
,:q
或CTRL+d
时,就我所知,repl会终止而不会发出信号。
在这种情况下如何执行一些清理代码?我已经尝试安装了几个信号处理程序,看看是否可以解决这个问题,但它似乎并不像ghci那样使用它们:
Prelude> import System.Posix.Signals
Prelude System.Posix.Signals> installHandler sigINT (Catch $ print "cleanup (via INT)") Nothing
Prelude System.Posix.Signals> installHandler sigTERM (Catch $ print "cleanup (via TERM)") Nothing
Prelude System.Posix.Signals> :quit
Leaving GHCi.
我希望的结果是cleanup (..)
被打印到控制台以表明它已被触发。
我知道可以使用:q
覆盖:quit
和:def
,但这并不能处理退出repl的首选方法,即{{1 }}
这个问题的上下文是这样的:我已经产生了一个进程来ssh隧道到运行不受保护的数据库的服务器。退出repl时此过程仍然存在,这迫使我每次都手动终止进程。
CTRL+d
答案 0 :(得分:1)
在审阅文档后,我认为没有一个好方法可以做到这一点。你应该考虑自己深入研究ghci代码来实现这个功能。