当通过命令行发送ctrl-c时,如何在Lua中捕获ctrl-c

我想知道当用户从命令行中按下 control-c 时,我可以保存一些东西。

我该怎么做?我已经查看过了,但没有看到任何东西。

注意:我有点熟悉 lua,但不是专家。我主要使用 lua 使用 Torch 库 (http://torch.ch/)。

点赞
用户5129715
用户5129715

有两种不希望出现的信号行为会导致代码复杂。

  1. 程序终止
  2. IO损坏

可以使用SetConsoleCtrlHandler/signal在C程序中捕获并记忆第一个行为。这将允许调用您的函数,并且您可以记住系统需要关闭。然后在Lua代码的某个点上,您可以看到它已经发生了(调用check),并执行您的整理和关闭操作。

第二个行为是,阻塞操作(读/写)将被信号取消,并且操作将无法完成。需要在每个IO事件中检查它,然后根据情况重新启动或取消。

2015-09-05 04:50:48
用户2328287
用户2328287

有一些 I/O 库支持这种操作。我知道 zmq 和 libuv。

使用 lluv 绑定的 libuv 示例——https://github.com/moteus/lua-lluv/blob/master/examples/sig.lua

当用户按下 Ctrl-C 时,ZeroMQ 的 poll 函数会返回 EINTR。

但我没有自己处理这个问题。

2015-09-09 05:54:17
用户4808555
用户4808555
`require('sys')`
`sys.catch_ctrl_c()`

我使用这个来捕获 cli 的退出。

2015-09-16 02:51:33
用户320911
用户320911

使用优秀的 luaposix 库实现 SIGINT 处理程序很简单:

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 文档。

2015-12-22 05:52:06