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