【发布时间】:2011-01-28 09:58:55
【问题描述】:
是否可以通过 Erlang 中的处理程序捕获 Linux 信号(例如 SIGUSR1)? (无需求助于用 C 语言制作的驱动程序)
【问题讨论】:
是否可以通过 Erlang 中的处理程序捕获 Linux 信号(例如 SIGUSR1)? (无需求助于用 C 语言制作的驱动程序)
【问题讨论】:
(不是真正的答案)
2001 年有人问:
谁有unix的例子 erlang中的信号处理。我会 喜欢做一个负载均衡器,我 已书面回复叹息。
当时的答案是:
没有规定处理 Erlang“本身”中的信号,即你 将需要使用驱动程序 - 或端口 当然,实际上可能是一个 更好的主意。同样对于司机案例, 模拟器有自己的处理程序 信号数量和干扰 可能会有 “有趣”的结果 - 但 SIGHUP 我相信应该没问题。
来源:http://www.erlang.org/pipermail/erlang-questions/2001-October/003752.html
据我所知,从那以后没有任何变化。但这非常有趣。如果有人对此有任何消息,请告诉我们:)
【讨论】:
自 2017 年 6 月发布的 Erlang/OTP 20.0 以来,这是可能的。它是通过 this pull request 完成的,它为信号添加了一个名为 erl_signal_server 的事件管理器。请参阅the kernel manual page 中的“OS 信号事件处理程序”部分。
如果您对 SIGUSR1 感兴趣,请注意默认处理程序将使 Erlang VM 停止并产生故障转储。为避免这种情况,将您自己的处理程序添加到erl_signal_server 是不够的;您必须为其交换默认处理程序:
gen_event:swap_handler(erl_signal_server, {erl_signal_handler, []}, {foo, []}).
【讨论】: