2015-03-18 13 views
6

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)

+3

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

Odpowiedz

1

Generalnie, sygnały zewnętrzne nie są włączone do wyjątków i przeszedł na programie (dla jednego, w programie wielowątkowym, który wątek je złapie?), ale zamiast tego są obsługiwane bezpośrednio przez RTS.

Jeśli chcesz słuchać za pomocą sygnału zewnętrznego i reagować na to, właściwy kierunek działania jest wywołanie installHandler z pakietu UNIX: http://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html

Powiązane problemy