如何从sigTERM处理程序退出程序?

时间:2017-04-27 13:38:35

标签: haskell

考虑这样的事情:

...

handleShutdown :: ThreadId -> IO ()
handleShutdown tid = doSomethingFunny >> throwTo tid ExitSuccess

main = do
    ...
    installHandler sigTERM (Catch $ myThreadId >>= handleShutdown) Nothing
    forever $ do
        stuff
    ...

如果以这种方式处理sigINT(Ctrl + C),则该过程很好地完成。但是,Haskell内部似乎正在使用sigTERM,上面的代码根本不会退出主进程。有没有办法在不使用sigTERM和自定义循环的情况下从MVar处理程序退出进程?我无法在任何地方找到sigTERM处理的任何信息(没有读取ghc来源,这对我来说太过分了。)

更新

以下作品:

main = do
    ...
    tid <- myThreadId -- This moved out of the Catch handler below.
    installHandler sigTERM (Catch $ handleShutdown tid) Nothing
    forever $ do
        stuff
    ...

1 个答案:

答案 0 :(得分:4)

很抱歉,简单回答,但在移动设备上。

您希望从处理程序本身外部运行myThreadId以获取主线程的ID。您目前正在获取信号处理程序本身的ID。