如何在Clojure中捕获CTRL + C?

时间:2012-07-29 13:32:01

标签: clojure signals

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

2 个答案:

答案 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))