Как поймать CTRL + C в Clojure?

У меня есть простая однопоточная программа Clojure, которая создает временный файл для обмена данными. Когда программа выходит из этого режима, этот файл удаляется, однако, когда программа выйдет через Ctrl + C, Ctrl + D или Ctrl + Z, этот бит кода никогда не выполняется. Мне нужно, чтобы он выполнил вопрос о том, как программа выйдет. Я знаю, что мне нужно поймать этот сигнал (я делал это раньше на других языках), но я не могу понять, как это сделать в Clojure.

Ответы

Ответ 1

Я не знаю, применил ли Clojure метод для этой цели. В java вы можете использовать Runtime.addShutdownHook()

Регистрирует новый крюк отключения виртуальной машины.

Виртуальная машина Java отключается в ответ на два вида событий:

  • Программа завершается нормально, когда последний поток не-daemon выходит или когда вызывается метод exit (эквивалентно, System.exit) или

  • Виртуальная машина завершается в ответ на прерывание пользователя, например, набирает ^ C или общесистемное событие, такое как выключение пользователя или выключение системы.

Update

Вот простая демонстрация

(.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (println "Shutting down..."))))

user=> ;; Ctrl-C
Shutting down...

Ответ 2

Посмотрите на метод deleteOnExit в файле java.io.File:

(import '(java.io File))
(doto (File/createTempFile "foo" nil nil) (.deleteOnExit))