我对这个主题做了一些研究,但发现了一些空白。在 Common Lisp 中似乎有依赖于实现的方法来进行 Unix 信号处理,但是是否有一个包可以提供跨实现的信号处理方法?
我主要想监听 SIGINT 并在我的应用程序中正常关闭。我在 Linux 上使用 Clozure CL 1.7...就像前面提到的,对于这个包来说,这会很棒,但如果我必须求助于特定于实现的代码,那也没关系。
我也没有完全接受使用 SIGINT(尽管它是理想的)。如果需要的话我可以使用另一个信号。
如果这会很混乱,是否有人有任何其他建议可以从应用程序外部优雅地关闭 lisp 应用程序?我的一个想法是创建一个应用程序监视的文件,如果它检测到该文件,它就会关闭......不过有点hacky。
Thanks!
尽管出于无知,我最初对 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
to t
并返回。
无论如何,希望这对其他人有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)