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

2023-11-21

我对这个主题做了一些研究,但发现了一些空白。在 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(使用前将#替换为@)

(通用)lisp 中的 Unix 信号处理 的相关文章

  • 如果从 Java 启动,子进程将忽略 SIGQUIT

    举这个简单的例子 public class Main public static void main String args throws Exception Runtime getRuntime exec sleep 1000 This
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 修改功能;保存到 Lisp 中的新函数

    所以我认为 lisp 在其他语言中 的优点之一是它能够实现函数工厂 接受函数作为参数 返回新函数 我想使用此功能对函数进行小的更改并将其保存为新函数 这样如果对原始函数进行更改 它们也会反映在它所基于的新函数中 注意 我不是编写原始函数的人
  • Common Lisp——为什么这个符号不是外部的?

    我正在尝试在 ASDF 中运行测试 如下所示 foo asd defsystem foo tests depends on foo fiveam components module tests components file main pe
  • (cons 'a (cons 'b 'c)) 和 (cons 'a '(b.c)) 之间的 Lisp 区别

    有什么区别 cons a cons b c A B C and cons a b c A B C 我需要使用 cons 创建以下列表 a b c 所以我试图理解 是什么 代表 L E 我有以下内容 cons cons a b c 但它产生
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • 简单信号 - C 编程和报警功能

    include
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • setf中的f代表什么?

    LISP 有setf函数给变量赋值 现在我一直想知道该函数的名称 Theset部分是显而易见的 但是什么是f后缀代表 F的实际含义经常被忘记 根据一些消息来源 f 后缀可以代表 字段 例如参见这个answer https stackover

随机推荐

  • 如何将环境变量传递给 Ubuntu 上的 Netbeans Makefile?

    我在 Linux Ubuntu 9 04 上使用 Netbeans 构建一个 C 项目 如何传递环境变量以便它对 Makefile 可见 如果我做一个正常的export MYVAR xyz 然后运行make从命令行这当然可以正常工作 但Ne
  • Android MVP:一个 Activity 具有多个 Fragment

    我有一个活动 它托管多个片段 这些片段定义用户注册流程中的每个步骤 该流程很复杂 下一步是由前面步骤中的用户操作定义的 流程如下 MainActivity Fragment1 gt Fragment2 gt Fragment3 gt Fra
  • 如何使用 SVML 指令 [重复]

    这个问题在这里已经有答案了 我正在尝试计算exponential使用 SIMD 的函数 我发现了这个功能 我已经包含了 immintrin h 在我的代码中 我的CPU也有一个SSE旗帜 但gcc正在抱怨error mm exp pd wa
  • dropzone js 将删除网址与删除按钮链接起来

    在 Dropzone Js 中 我正在创建删除按钮 然后将其附加到缩略图中 如何链接直接从服务器获取的 url 以使用删除按钮addRemoveLinks true Write function if you need to add som
  • PrettyPhoto 的 rel 属性验证错误

    看起来 W3C 的验证器在 HTML5 页面的 PrettyPhoto rel 属性上返回验证错误 我该如何解决这个错误 元素 a 上的属性 rel 值有错误 PrettyPhoto gallery1 未注册关键字 PrettyPhoto
  • Android AlertDialog 框 WindowManager$BadTokenException 问题

    我将以下代码用于上下文菜单 然后如果用户选择删除 则会出现对话框消息 infos setOnCreateContextMenuListener new OnCreateContextMenuListener Override public
  • Greasemonkey 可以使用 file:// 协议吗?

    我有一个简单的 Greasemonkey 脚本 UserScript name hello namespace http www webmonkey com description A test of accessing documents
  • Smalltalk 中的运算符可以过载吗?

    Smalltalk 中是否可以重载运算符 我正在寻找教程 示例 Thanks Smalltalk 中不可能进行方法重载 相反 方法重写和称为的技术的组合双重调度用于实现与其他语言中的运算符重载相同的行为 您可以在数学运算符中找到示例实现 这
  • Android Studio:该文件不是项目的一部分,但项目构建成功

    我在android studio中突然出现了一个奇怪的问题 我创建了一个新的 cpp 文件 并将其包含在 Android mk 中 然后我同步了该项目 然而 android studio 仍然抱怨该文件不是项目的一部分 我需要同步 但整个项
  • 找不到模块FindOpenCV.cmake(配置过程中出错)

    我写了一个CMakeLists txt对于一个项目C 它使用OpenCV图书馆 当我尝试使用 cmake 创建项目时 出现下一个配置问题 CMake Error at CMakeLists txt 15 find package Could
  • 如何告诉 Symfony 3 忽略某些注释?

    我正在使用 Symfony 3 开发 API 我想使用apidoc创建文档 APIDoc 使用注释 api get user id Request User information apiName GetUser apiGroup User
  • 如何提取没有索引的数组的键和值[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想从数组 带有键和值的原始数组 中提取数据 提取数组后 我需要两个新数组 第一个数组仅
  • 将 backstack 与 ViewPager 结合使用

    我正在使用 ViewPager 在我的 Android 应用程序中实现滑动 但是 我希望当用户使用后退按钮而不是结束活动时显示前一个片段 有什么办法可以做到这一点吗 谢谢 塞巴斯蒂安 我有类似的问题 这就是我解决的方法 我有一个包含 6 个
  • 如何使用 python lambda 捕获异常

    假设 Python 版本 gt 3 并调用函数列表 我想编写一个处理异常的 lambda 函数 事实是 它不起作用 当函数中抛出异常时 程序返回并且调用堆栈看不到executeFunction in it 怎么办呢 def executeF
  • 检查文本文件中是否存在字符串

    所以我有 def CheckUserExists user with open C database txt r as file if re search user file read return True else return Fal
  • MySQL并发更新

    我有一个小型 POS 系统 服务器端使用 PHP 和 MySql InnoDB 当 销售 完成时 执行以下查询来更新库存数量 UPDATE products SET qty qty qty ustatus 1 WHERE pid pid 这
  • 正确使用SetThreadAffinityMask

    有 12 个核心 12 个线程正在运行 我想将 1 个线程绑定到每个核心 这就是我在每个线程的开头所说的 int core 12 SetThreadAffinityMask GetCurrentThread 1 lt
  • VBA 取消过滤范围

    我正在使用这段代码 Sheets Sheet1 AutofilterMode False 使用 VBA 取消筛选 Excel 工作表中的数据 重点是清除所有筛选器 这似乎并不总是有效 有更好的方法吗 谢谢你 如果有帮助的话 该表是从 Sql
  • 如何通过多个sudo和su命令找到原始用户?

    通过 sudo 或 su 运行脚本时 我想获取原始用户 无论是否有多个 这都应该发生sudo or su彼此内部运行 特别是sudo su Results Use who am i awk print 1 OR logname因为没有其他方
  • (通用)lisp 中的 Unix 信号处理

    我对这个主题做了一些研究 但发现了一些空白 在 Common Lisp 中似乎有依赖于实现的方法来进行 Unix 信号处理 但是是否有一个包可以提供跨实现的信号处理方法 我主要想监听 SIGINT 并在我的应用程序中正常关闭 我在 Linu