考虑这样的事情:
...
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
...
答案 0 :(得分:4)
很抱歉,简单回答,但在移动设备上。
您希望从处理程序本身外部运行myThreadId以获取主线程的ID。您目前正在获取信号处理程序本身的ID。