我有一个创建用于交换数据的临时文件的简单单线程的Clojure程序。 当程序退出通常此文件被删除,但是当程序经由Ctrl + C 键 ,Ctrl键 + d,或Ctrl + Z的代码,位从不执行退出。 我需要它来执行regardles SOF程序是如何退出。 我知道我需要赶上信号(我以前在其他语言中做到了这一点),但我似乎无法弄清楚如何做到这一点Clojure中。
Answer 1:
我不知道是否已经的Clojure包裹方法达到这个目的。 在Java中,你可以使用Runtime.addShutdownHook()
注册新的虚拟机关闭挂钩。
Java虚拟机关闭响应两种事件:
在程序正常退出,当最后一个非守护线程退出时或者当(等同于System.exit)方法被调用的出口处,或
虚拟机被终止在响应于用户中断,如打字^ C,或一个全系统的事件,如用户注销或系统关闭。
更新
下面是一个简单的演示
(.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (println "Shutting down..."))))
user=> ;; Ctrl-C
Shutting down...
Answer 2:
看一看在deleteOnExit在java.io.File中的方法:
(import '(java.io File))
(doto (File/createTempFile "foo" nil nil) (.deleteOnExit))
文章来源: How to catch CTRL+C in Clojure?