2015-09-01 2 views
16

Ich würde gerne wissen, wenn der Benutzer von einer Befehlszeile control-c drückt, damit ich ein paar Sachen speichern kann.Wie fangen ctrl-c in lua wenn ctrl-c über die Befehlszeile gesendet wird

Wie mache ich das? Ich habe geschaut, habe aber nichts gesehen.

Hinweis: Ich bin vertraut mit Lua, aber ich bin kein Experte. Ich benutze lua meist die Bibliothek Fackel zu verwenden (http://torch.ch/)

+0

Ctrl-C ist abfangbar mit 'pcall' –

+0

Leider ist Ctrl-C auf LuaJIT nicht mit pcall abfragbar. –

+2

Wie genau fangen Sie es mit pcall? pcall (io.read()) fängt nicht doppeltes ctrl-c ein, nur ctrl-c + enter. –

Antwort

2

windows : SetConsoleCtrlHandler

linux : signal

Es gibt zwei Verhalten des Signals, die unerwünscht sind, die Komplexität im Code verursacht.

  1. Programmabbruch
  2. Gebrochene IO

Das erste Verhalten kann durch die Verwendung SetConsoleCtrlHandler/Signals in einem C-Programm gefangen und in Erinnerung bleiben. Dadurch kann Ihre Funktion aufgerufen werden und Sie können sich daran erinnern, dass das System heruntergefahren werden muss. Dann siehst du irgendwann im lua-Code, dass es passiert ist (Call to check), und führe deinen Auf- und Abbau durch.

Das zweite Verhalten ist, dass eine blockierende Operation (Lesen/Schreiben) durch das Signal abgebrochen wird und die Operation nicht abgeschlossen ist. Dies müsste bei jedem E/A-Ereignis überprüft und dann erneut gestartet oder gegebenenfalls abgebrochen werden.

+1

Ein praktisches Beispiel? – Black

+0

Blockiervorgänge werden bei jedem Signal EINTRKT, nicht nur bei SIGINT (das vom Terminal an C-c verarbeitet wird). Dies geschieht jedoch nur, wenn SA_RESTART beim Installieren eines neuen Signal-Handlers nicht gesetzt wurde. – user3125367

0
require('sys') 
sys.catch_ctrl_c() 

Ich benutze dies, um den Ausgang von CLI zu fangen.

3

ein SIGINT Handler Implementierung ist einfach, die ausgezeichnete luaposix Bibliothek:

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) 

für weitere Informationen an die posix.signal Moduls API-Dokumentation.

Verwandte Themen