Я обычно использую forkIO
для порождения simpleHTTP
в отдельном потоке.И тогда waitForTermination
для ожидания ^C
.
module Main where
import Control.Concurrent (killThread, forkIO)
import Happstack.Server (nullConf, simpleHTTP, ok, toResponse)
import Happstack.State (waitForTermination)
main :: IO ()
main =
do putStrLn "begin server"
httpThreadId <- forkIO $ simpleHTTP nullConf (ok $ toResponse "This site rules!")
waitForTermination
killThread httpThreadId
putStrLn "end server"
waitForTermination
приходит из пакета happstack-state
.Это действительно нужно переместить куда-то еще по нескольким причинам.Если вы не хотите устанавливать happstack-state
, вы можете скопировать и вставить локальную копию в свое приложение:
-- | Wait for a signal.
-- On unix, a signal is sigINT or sigTERM.
waitForTermination :: IO ()
waitForTermination
= do istty <- queryTerminal stdInput
mv <- newEmptyMVar
installHandler softwareTermination (CatchOnce (putMVar mv ())) Nothing
case istty of
True -> do installHandler keyboardSignal (CatchOnce (putMVar mv ())) Nothing
return ()
False -> return ()
takeMVar mv