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

当通过命令行发送ctrl-c时,如何在lua中捕获ctrl-c,lua,luajit,torch,Lua,Luajit,Torch,我想知道命令行中的用户何时按下control-c以便保存一些内容 我该怎么做?我看过了,但什么也没看到 注意:我对lua有点熟悉,但我不是专家。我主要使用lua来使用库火炬() 信号有两种不需要的行为,这将导致代码的复杂性 程序终止 破碎的木卫一 通过使用SetConsoleCtrlHandler/signal,可以在C程序中捕获并记住第一个行为。这将允许调用您的函数,您可以记住系统需要关闭。然后在lua代码中的某个点上,您会看到它已经发生(调用以检查),并执行清理和关闭 第二种行为是,阻塞操

我想知道命令行中的用户何时按下control-c以便保存一些内容

我该怎么做?我看过了,但什么也没看到

注意:我对lua有点熟悉,但我不是专家。我主要使用lua来使用库火炬()

信号有两种不需要的行为,这将导致代码的复杂性

  • 程序终止
  • 破碎的木卫一
  • 通过使用SetConsoleCtrlHandler/signal,可以在C程序中捕获并记住第一个行为。这将允许调用您的函数,您可以记住系统需要关闭。然后在lua代码中的某个点上,您会看到它已经发生(调用以检查),并执行清理和关闭


    第二种行为是,阻塞操作(读/写)将被信号取消,并且该操作将未完成。这需要在每次IO事件中进行检查,然后重新启动,或根据需要取消。

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

    具有lluv结合的Libuv示例-

    当用户按Ctrl-C时,ZeroMQ从轮询函数返回EINTR

    但我不是一个人处理的

    require('sys')
    sys.catch_ctrl_c()
    
    我使用它捕获cli的退出。

    使用优秀的库实现处理程序非常简单:


    有关更多信息,请参阅模块的API文档。

    Ctrl-C可以通过
    pcall
    捕获。不幸的是,在LuaJIT上,Ctrl-C不能通过pcall捕获。如何使用pcall捕获它?pcall(io.read())无法捕获双ctrl-c,只有ctrl-c+enter。@KarlP-
    lua-e“打印(pcall(io.read))”
    ctrl-c
    中断,而不按
    enter
    。请描述您的测试方法。@EgorSkriptunoff取决于基本的libc,我想。OpenWrt/uclibc您需要输入,桌面linux您不需要。有实际的例子吗?阻塞操作是在任何信号上进行的,而不仅仅是SIGINT(由C-C上的终端发送到进程)。但只有在安装新的信号处理程序时未设置SA_RESTART时才会发生这种情况。如果我在Lua或LuaJIT CLI上尝试此操作,我会得到
    stdin:1:未找到模块“sys:…
    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)