我想知道用户何时从命令行按下 control-c,这样我就可以保存一些东西。
我该怎么做呢?我看过但还没有真正看到任何东西。
注意:我对 lua 有点熟悉,但我不是专家。我主要使用 lua 来使用 Torch 库(http://torch.ch/)
我想知道用户何时从命令行按下 control-c,这样我就可以保存一些东西。
我该怎么做呢?我看过但还没有真正看到任何东西。
注意:我对 lua 有点熟悉,但我不是专家。我主要使用 lua 来使用 Torch 库(http://torch.ch/)
SIGINT
使用优秀的luaposix库实现处理程序很简单:
local signal = require("posix.signal")
signal.signal(signal.SIGINT, function(signum)
io.write("\n")
-- put code to save some stuff here
os.exit(128 + signum)
end)
有关详细信息,请参阅posix.signal模块的 API 文档。
存在支持这一点的 io 库。我知道 zmq 和 libuv
带有 lluv 绑定的 Libuv 示例 - https://github.com/moteus/lua-lluv/blob/master/examples/sig.lua
当用户按下 Ctrl-C 时,ZeroMQ 从轮询函数返回 EINTR
但我不自己处理
信号有两种行为是不可取的,这将导致代码的复杂性。
通过使用 SetConsoleCtrlHandler/signal,可以在 C 程序中捕获并记住第一个行为。这将允许调用您的函数,并且您可以记住系统需要关闭。然后在 lua 代码中的某个时刻,您会看到它已经发生(调用检查),然后执行您的整理和关闭操作。
第二种行为,是阻塞操作(读/写)将被信号取消,操作将未完成。这需要在每个 IO 事件中进行检查,然后根据需要重新启动或取消。
require('sys')
sys.catch_ctrl_c()
我用它来捕捉 cli 的退出。