Próbowałem zrobić demona, który został zatrzymany, wysyłając mu sygnał SIGTERM (jak zwykle dla demonów). Demon uzyskuje pewne zasoby, które powinny zostać uwolnione po uruchomieniu, a ja chciałem to zrobić za pomocą nawiasów.wspornik haskells na SIGTERM
Zauważyłem, że część czyszczenia węzłówki nie jest uruchamiana, gdy program kończy się na SIGTERM. To może być powielana z tym programem:
main = bracket (return "ending")
(\x -> putStrLn x)
(\_ -> threadDelay 10000000000000)
Ten prosty program powinien nabyć ciąg "ending"
(dla uproszczenia tylko przez przestrajania go) i wydrukować, że zdobytą ciąg na zakończenie.
Kiedy przerywa program za pomocą ctrl-c, zachowuje się jak oczekiwano i drukuje "zakończenie" przy wyjściu, ale kiedy zabiję go przy pomocy killall -TERM test
(plik wykonywalny nazywa się testem), drukuje "Beendet" ("Zakończono" w niemiecki), więc ostatnia część nawiasu nie jest uruchamiana.
Czy to błąd, czy też robię coś nie tak?
Używam GHC 7.6.3 i biegnę na Linux/Debian GNU jessie i386 (i686)
Wydaje się, że GHC traktuje SIGTERM odmiennie od innych wyjątków. [To] (http://stackoverflow.com/questions/18430748/killing-a-haskell-binary) pytanie może być przydatne. – user2407038