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)
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