我尝试了以下方法:
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
在Ctrl-C
上,而不是退出。我该怎么做呢?
答案 0 :(得分:20)
来自installHandler
的文档:
安装了一个处理程序,它将在收到信号时(或之后不久)调用新线程中的操作。
和exitWith:
注意:在GHC中,应该从主程序线程调用exitWith以退出进程。从另一个线程调用时,exitWith将正常抛出ExitException,但该异常不会导致进程本身退出。
因此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)
我认为它也能可靠地运作,但我并不完全确定。