[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?
Cheers
Ben
--
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