我已经对这个主题做了一些研究,但结果是空白。在 Common Lisp 中似乎有依赖于实现的 Unix 信号处理方式,但是是否有一个包可以提供交叉实现方式来进行信号处理?
我主要想监听 SIGINT 并在我的应用程序中正常关闭。我在 Linux 上使用 Clozure CL 1.7...如前所述,它非常适合用于此目的的包,但如果我必须求助于特定于实现的代码,那很好。
我也没有完全接受使用 SIGINT(尽管它是理想的)。如果需要,我可以使用其他信号。
如果这会很麻烦,有没有人有任何其他建议从应用程序外部优雅地关闭 lisp 应用程序?我的一个想法是创建一个应用程序监控的文件,如果它检测到该文件,它就会关闭……不过有点老套。
谢谢!
最佳答案
尽管出于无知,我最初对 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))
请注意,据我了解,回调正文中的任何内容都必须简短明了!没有冗长的处理。在链接的文章中,宏实际上创建了一个单独的线程来处理信号,这对我来说太过分了,因为我只是将全局变量从 nil
设置为 t
并返回。
无论如何,希望这对其他人有帮助!
关于lisp - (通用)lisp 中的 Unix 信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9950680/