[Haskell-cafe] GHC handling of signals

Donn Cave donn at avvanta.com
Sat May 27 14:46:44 UTC 2023


quoth Ben Franksen <ben.franksen at online.de>
> Consider the following program:
> 
> import System.IO
> import System.IO.Error
> import System.Posix.Signals
> 
> main = do
>    installHandler sigPIPE Default Nothing
>    c <- readFile "/usr/share/dict/words"
>    putStrLn c `catchIOError` \e -> hPutStrLn stderr (show e)
>    hPutStrLn stderr "I survived"
> 
> Compile with ghc and run as
> 
> ./test | true
> 
> As expected, you see nothing further displayed, since according to `man 
> 7 signal` the default for SIGPIPE is to terminate the program, which 
> happens before the exception handler has a chance to run.
> 
> Without the line where the signal handler gets installed the behavior is 
> different: You'll see:
> 
> <stdout>: commitBuffer: resource vanished (Broken pipe)
> I survived
> 
> Apparently the GHC runtime does something like
> 
>    installHandler sigPIPE Ignore Nothing
> 
> This is not a complaint, I find the behavior quite reasonable and much 
> more predictable than the default (why should I not be able to catch 
> EPIPE and continue?).
> 
> The question is whether it is documented how the GHC runtime treats 
> signals and if yes where?

For more on this, see https://mail.haskell.org/pipermail/glasgow-haskell-users/2010-August/019082.html

That thread doesn't really go into why GHC interferes with SIGPIPE.  I personally would lean towards letting the operating system defaults prevail, but whatever, I don't do Haskell anyway.  The discussion there is more about why Ignore, rather than SIG_IGN.

	Donn


More information about the Haskell-Cafe mailing list