I'm trying to make a Elisp program that is run in a non-interactive mode, i.e. essentially as `emacs --batch --load myfile.el'. A normal way to shutdown terminal programs is with C-c, which is expected to be "graceful" shutdown, e.g. the program still has a chance to save files etc.
However, with Elisp I'm not sure how to achieve that except for constantly modifying `kill-emacs-hook', which would be a nightmare from coding perspective.
Naively I would expect this print "GOING DOWN" when aborted with C-c:
$ emacs --batch --eval "(unwind-protect (while t) (message \"GOING DOWN\"))"
For example, Python's handler of SIGINT raises an exception within the program, which unwinds the stack as usual and, unless caught, cause program termination after cleaning up as expected (e.g. running all `finally' clauses and closing all `with' context managers). However, in Elisp, as I understand, there is no way to have a say in handling SIGINT other than adding a function to `kill-emacs-hook'.
Is that correct, or am I missing something here?