2015-09-01 12 views
16

Mi piacerebbe sapere quando l'utente da una riga di comando preme control-c in modo da poter salvare alcune cose.Come catturare ctrl-c in lua quando ctrl-c viene inviato tramite la riga di comando

Come posso fare? Ho guardato ma non ho visto nulla.

Nota: ho una certa familiarità con lua, ma non sono esperto. Io uso soprattutto lua utilizzare la libreria Torcia (http://torch.ch/)

+0

Ctrl-C è catchable con 'pcall' –

+0

Sfortunatamente, su LuaJIT Ctrl-C non è catchable con pcall. –

+2

Come lo prendi esattamente con il pcall? pcall (io.read()) non cattura il doppio ctrl-c, solo ctrl-c + enter. –

risposta

2

windows : SetConsoleCtrlHandler

linux : signal

Ci sono due comportamenti del segnale che sono indesiderabili, che farà sì che la complessità nel codice.

  1. terminazione Programma
  2. rotto IO

Il primo comportamento può essere catturato e ricordato in un programma C utilizzando SetConsoleCtrlHandler/segnale. Ciò consentirà di chiamare la funzione e ricordare che il sistema deve essere arrestato. Quindi, ad un certo punto nel codice lua, vedi che è successo (chiama per controllare) ed esegui il tuo ordine e spegnimento.

Il secondo comportamento è che un'operazione di blocco (lettura/scrittura) verrà annullata dal segnale e l'operazione non verrà completata. Dovrebbe essere verificato a ogni evento IO e quindi riavviato o annullato a seconda dei casi.

+1

Qualche esempio pratico? – Black

+0

Le operazioni di blocco sono EINTR'ed su qualsiasi segnale, non solo SIGINT (che viene inviato per elaborare da terminale su C-c). Ma questo accade solo se SA_RESTART non è stato impostato durante l'installazione di un nuovo gestore di segnale. – user3125367

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

Lo uso per catturare l'uscita da cli.

3

implementazione di un gestore SIGINT è semplice utilizzando l'eccellente luaposix libreria:

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) 

Fare riferimento alla documentazione delle API del modulo posix.signal per ulteriori informazioni.

Problemi correlati