如何在Haskell中编写Ctrl-C处理程序?

如何在Haskell中编写Ctrl-C处理程序?,haskell,signals,Haskell,Signals,我尝试了以下方法: 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 在Ctr

我尝试了以下方法:

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
上,而不是退出。我应该如何正确地执行此操作?

来自
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)
导入系统。退出
导入System.Posix.Signals
导入控制。并发
main::IO()
main=do

tid“将当前线程挂起给定的微秒数”,类似于C中的
usleep
。在这里,我们挂起执行的唯一目的是让用户有足够的时间按下Ctrl-C。有没有一种简单的方法可以无限期地延迟线程而不是给定的微秒数?
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)