signal handling weirdness

Lemmih lemmih at gmail.com
Sun Apr 17 09:24:37 EDT 2005


On 4/17/05, Volker Wysk <post at volker-wysk.de> wrote:
> Hello.
> 
> I'm trying to install a handler for the TERM signal:
> 
> import System.Posix.Signals
> import System.Posix.Unistd
> import Monad
> 
> main =
>    do installHandler sigTERM handler Nothing
>       sequence (repeat (putStrLn "bla" >> sleep 5))
>       return ()
> 
> handler = Catch (putStrLn "caught SIGTERM")
> -- handler = Ignore
> 
> When you type ^C, the current pause gets cut short, but the program continues
> to output "bla". It then terminates after another three to five "bla"'s.
> Installing a signal handler has no effect at all, regardless of whether it's
> Ignore or Catch (...).
> 
> /tmp $ ghc -o sig sig.hs  -package posix
> /tmp $ ./sig
> bla
> bla
> bla
> bla
> bla
> sig: interrupted
> 
> I'm using GHC 6.4 on Debian Linux.

>From sleep(3): "sleep()  makes  the  current  process  sleep  until 
'seconds' seconds have elapsed or a signal arrives which is not
ignored."
So 'sleep' returns when a signal arrives and C-c emits an interrupt
signal (sigINT) and not a termination signal (sigTERM), which is why
the pause gets cut short.
You may wanna use Control.Concurrent.threadDelay instead of sleep.

-- 
Friendly,
  Lemmih



More information about the Glasgow-haskell-bugs mailing list