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