SIGTERM 上的 haskells 括号

haskells bracket on SIGTERM

我一直在尝试制作一个通过向其发送 SIGTERM 信号来停止的守护进程(就像守护进程通常那样)。守护进程获取了一些应该在 运行ning 之后释放的资源,我想使用括号来这样做。

我注意到当程序以 SIGTERM 终止时,括号的清理部分不是 运行。这可以用这个程序重现:

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

这个简单的程序应该获取字符串 "ending"(为简单起见,只需重新调整它)并在结束时打印获取的字符串。

当我用 ctrl-c 中断程序时,它的行为与预期的一样并在退出时打印 "ending",但是当我用 killall -TERM test 终止它时(可执行文件名为 test)它打印 "Beendet"(德语为 "Ended"),因此括号的最后部分不是 运行.

这是一个错误还是我做错了什么?

我正在使用 GHC 7.6.3 并且 运行正在 Linux/GNU Debian jessie i386 (i686)

一般情况下,外部信号不会变成异常并传递给程序(例如,在多线程程序中,哪个线程会捕获它们?),而是直接由 RTS 处理。

如果您想监听外部信号并对其做出反应,正确的做法是从 unix 包中调用 installHandlerhttp://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html