我尝试了以下方法:
import System.Exit
import System.Posix.Signals
import Control.Concurrent (threadDelay)
main :: IO ()
main = do
installHandler keyboardSignal (Catch (do exitSuccess)) Nothing
threadDelay (1000000000)
但它只输出:
^CTest.hs: ExitSuccess
on Ctrl-C
,而不是退出。我应该怎样做才正确呢?
从文档installHandler
:
安装了一个处理程序,该处理程序将在收到信号时(或之后不久)调用新线程中的操作。
and exitWith:
注意:在 GHC 中,应该从主程序线程调用 exitWith 才能退出进程。当从另一个线程调用时,exitWith 将像平常一样抛出 ExitException,但该异常不会导致进程本身退出。
So an exitSuccess
处理程序不会结束进程,这是预期的(尽管是意外的;)行为。
如果您想立即采取行动,
import System.Exit
import System.Posix.Signals
import Control.Concurrent
main :: IO ()
main = do
tid <- myThreadId
installHandler keyboardSignal (Catch (killThread tid)) Nothing
threadDelay (1000000000)
收到信号后立即终止线程。
如果你想成功退出,就不那么激烈了
import System.Exit
import System.Posix.Signals
import Control.Concurrent
import qualified Control.Exception as E
main :: IO ()
main = do
tid <- myThreadId
installHandler keyboardSignal (Catch (E.throwTo tid ExitSuccess)) Nothing
threadDelay (10000000)
我认为它也会可靠地工作,但我不完全确定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)