尽管出于无知,我最初对 Daimrod 关于使用 CFFI 的评论(问题下的第一条评论)持怀疑态度,但我环顾四周,发现http://clozure.com/pipermail/openmcl-devel/2010-July/011675。 .html _ 我对其进行了调整以使用 CFFI,并确认这在 linux 上的 SBCL/CCL/clisp(可能是其他人)上运行得非常好:
(defmacro set-signal-handler (signo &body body)
(let ((handler (gensym "HANDLER")))
`(progn
(cffi:defcallback ,handler :void ((signo :int))
(declare (ignore signo))
,@body)
(cffi:foreign-funcall "signal" :int ,signo :pointer (cffi:callback ,handler)))))
(set-signal-handler 2
(format t "Quitting lol!!!11~%")
;; fictional function that lets the app know to quit cleanly (don't quit from callback)
(signal-app-to-quit))
请注意,据我了解,回调正文中的任何内容都必须简短而甜蜜!无需冗长的处理。在链接的文章中,宏实际上创建了一个单独的线程来处理信号,这对我的目的来说是多余的,因为我只是设置一个全局变量 from nil
tot
并返回。
无论如何,希望这对其他人有帮助!