17

我有一个简单的单线程 Clojure 程序,它创建一个用于交换数据的临时文件。当程序正常退出时,该文件被删除,但是当程序通过Ctrl+ CCtrl+DCtrl+退出时,Z该位代码永远不会执行。无论程序如何退出,我都需要它来执行。我知道我需要捕捉那个信号(我以前用其他语言做过),但我似乎不知道如何在 Clojure 中做到这一点。

4

2 回答 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 回答