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

时间:2015-09-01 17:27:44

标签: lua luajit torch

我想知道来自命令行的用户何时按下control-c,这样我就可以节省一些东西。

我该怎么做?我看过但却没有看到任何东西。

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

4 个答案:

答案 0 :(得分:4)

使用优秀的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文档。

答案 1 :(得分:2)

windows : SetConsoleCtrlHandler

linux : signal

信号有两种不合需要的行为,会导致代码复杂化。

  1. 程序终止
  2. IO IO
  3. 可以使用SetConsoleCtrlHandler / signal在C程序中捕获并记住第一个行为。这将允许调用您的函数,您可以记住系统需要关闭。然后在lua代码中的某个时刻,你会看到它已经发生(调用检查),然后执行你的整理和关闭。

    第二种行为是信号取消阻塞操作(读/写),操作将完成。这需要在每个IO事件中进行检查,然后重新启动,或者在适当时取消。

答案 2 :(得分:2)

存在支持此功能的io库。 我知道zmq和libuv

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

当用户按下Ctrl-C

时,ZeroMQ从轮询功能返回EINTR

但我不会自己处理

答案 3 :(得分:0)

require('sys')
sys.catch_ctrl_c()

我用它来赶上cli的退出。