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

Jan*_*ček 6 haskell

考虑这样的事情:

...

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

main = do
    ...
    installHandler sigTERM (Catch $ myThreadId >>= handleShutdown) Nothing
    forever $ do
        stuff
    ...
Run Code Online (Sandbox Code Playgroud)

如果sigINT(Ctrl+C) 以这种方式处理,则该过程会很好地完成。但是,似乎sigTERMHaskell 内部正在使用,上面的代码根本没有从主进程中退出。有没有办法在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
    ...
Run Code Online (Sandbox Code Playgroud)

Mic*_*man 6

对不起,回答简短,但在移动设备上。

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