[英]haskells bracket on SIGTERM
我一直试图通过发送一个SIGTERM信号来制作一个守护进程(就像通常用于守护进程一样)。 守护进程获取了一些应该在运行后释放的资源,我想使用括号来执行此操作。
我注意到当程序以SIGTERM终止时,括号的清理部分不会运行。 这个程序可以复制:
main = bracket (return "ending")
(\x -> putStrLn x)
(\_ -> threadDelay 10000000000000)
这个简单的程序应该获取字符串"ending"
(为了简单起见,只需重新调整它)并在结束时打印获取的字符串。
当我用ctrl-c中断程序时,它表现得像预期的那样并在退出时打印“结束”,但当我用killall -TERM test
(可执行文件命名为test)杀死它时,它打印出“Beendet”(“Ended”in German ),所以支架的最后部分没有运行。
这是一个错误还是我做错了什么?
我正在使用GHC 7.6.3并且我在Linux / GNU上运行Debian jessie i386(i686)
通常,外部信号不会变成异常并传递给程序(例如,在多线程程序中,哪个线程会捕获它们?),而是由RTS直接处理。
如果你想听一个外部信号并对它作出反应,正确的做法是从unix包中调用installHandler
: http : installHandler
POSIX的Signals.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.