lisp - (通用)lisp 中的 Unix 信号处理

标签 lisp common-lisp signals sigint ccl

我已经对这个主题做了一些研究,但结果是空白。在 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/

相关文章:

tree - 在 Lisp 中对树使用 reduce

lisp - "unfold"用于常见的 lisp?

go - 无法 `syscall.Kill()` 一个守护进程

c - SIGSTOP/SIGCONT POSIX 行为

Lisp - 从输入中读取并存储 2 个值

list - CLISP : Check if two elements are in order one after another in a list

vim - Slimv - 更改 REPL 垂直拆分

lisp - 为什么不同函数之间的谓词命名约定不同?

function - 在 Common Lisp 中,是否有一个函数可以从给定的字符串中返回一个符号?

qt - Qt 中插件的自定义信号