我有一个简单的单线程Clojure程序,它创建一个用于交换数据的临时文件。当程序正常退出时,该文件将被删除,但是当程序通过 Ctrl + C 退出时, Ctrl + D ,或者 Ctrl + Z 这段代码永远不会执行。我需要它来执行程序退出的方式。我知道我需要捕捉到这个信号(我以前用其他语言做过),但我似乎无法弄清楚如何在Clojure中做到这一点。
答案 0 :(得分:29)
我不知道Clojure是否为此目的包装了方法。在java中,您可以使用Runtime.addShutdownHook()
注册新的虚拟机关闭挂钩。
Java虚拟机关闭以响应两种事件:
当最后一个非守护程序线程退出或调用exit(等效,System.exit)方法时,程序正常退出,或者
虚拟机将响应用户中断(例如键入^ C)或系统范围的事件(例如用户注销或系统关闭)而终止。
这是一个简单的演示
(.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (println "Shutting down..."))))
user=> ;; Ctrl-C
Shutting down...
答案 1 :(得分:1)
查看java.io.File中的deleteOnExit方法:
(import '(java.io File))
(doto (File/createTempFile "foo" nil nil) (.deleteOnExit))