[Haskell-cafe] GHC handling of signals

Ben Franksen ben.franksen at online.de
Sat May 27 13:53:55 UTC 2023

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?

I would rather have questions that cannot be answered, than answers that
cannot be questioned.  -- Richard Feynman

More information about the Haskell-Cafe mailing list