Как поймать ctrl-c в lua, когда ctrl-c отправляется через командную строку

Я хотел бы знать, когда пользователь из командной строки нажимает control-c, поэтому я могу сохранить некоторые вещи.

Как мне это сделать? Я посмотрел, но ничего не видел.

Примечание. Я немного знаком с lua, но я не эксперт. В основном я использую lua для использования библиотеки Torch (http://torch.ch/)

Ответы

Ответ 1

Реализация 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)

Дополнительную информацию см. в документации по API модуля posix.signal.

Ответ 2

окна: SetConsoleCtrlHandler

linux: сигнал

Есть два поведения нежелательных сигналов, которые будут вызывать сложности в коде.

  • Окончание программы
  • Сломанный IO

Первое поведение можно поймать и запомнить в программе на C с помощью SetConsoleCtrlHandler/signal. Это позволит вызывать вашу функцию, и вы можете помнить, что системе необходимо завершить работу. Затем в какой-то момент в коде lua вы видите, что это произошло (вызов для проверки), и выполните ваш порядок и завершение работы.

Вторым поведением является то, что операция блокировки (чтение/запись) будет отменена сигналом, и операция будет незавершенной. Это нужно будет проверять в каждом событии ввода-вывода, а затем повторно запускаться или отменяться по мере необходимости.

Ответ 3

Существуют библиотеки io, которые поддерживают это. Я знаю zmq и libuv

Пример Libuv с привязкой lluv - https://github.com/moteus/lua-lluv/blob/master/examples/sig.lua

ZeroMQ возвращает EINTR из функции опроса, когда пользователь нажимает Ctrl-C

Но я не справляюсь с самим собой

Ответ 4

require('sys')
sys.catch_ctrl_c()

Я использую это, чтобы поймать выход из cli.