Как поймать 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.