2015-03-18 13 views
6

Ho cercato di far arrestare un daemon inviando un segnale SIGTERM (come per i daemon). Il demone acquisisce alcune risorse che dovrebbero essere liberate dopo l'esecuzione e volevo usare la parentesi per farlo.parentesi haskells su SIGTERM

Ho notato che la parte di pulizia della parentesi non viene eseguita quando il programma termina con SIGTERM. Questo può essere riprodotto con questo programma:

main = bracket (return "ending") 
     (\x -> putStrLn x) 
     (\_ -> threadDelay 10000000000000) 

Questo semplice programma dovrebbe acquisire la stringa "ending" (per semplicità semplicemente risintonizzare) e di stampa che ha acquisito stringa sulla fine.

Quando interrompo il programma con ctrl-c, si comporta come previsto e stampa "fine" all'uscita, ma quando lo uccido con killall -TERM test (l'eseguibile è denominato test) stampa "Beendet" ("Terminato" in tedesco), quindi la parte finale della parentesi non viene eseguita.

È un errore o sto facendo qualcosa di sbagliato?

sto usando GHC 7.6.3 e sto correndo su Linux/Debian GNU Jessie i386 (i686)

+3

Sembra che tratta ghc SIGTERM in modo diverso da altre eccezioni. [Questa] (http://stackoverflow.com/questions/18430748/killing-a-haskell-binary) domanda potrebbe essere utile. – user2407038

risposta

1

In generale, i segnali esterni non vengono trasformati in eccezioni e superato sul programma (per uno, in un programma multithread, quale thread li catturerebbe?), ma invece sono gestiti direttamente dall'RTS.

Se si desidera ascoltare per un segnale esterno e reagire ad essa, la corretta linea di azione è quello di chiamare installHandler dal pacchetto UNIX: http://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html