The RTS chokes on SIGPIPE (happens with runInteractiveCommand)
|Reported by:||int-e||Owned by:|
|Type of failure:||Test Case:|
|Related Tickets:||Differential Rev(s):|
Consider the following code.
-- code based on example by steven_ashley on #haskell import System.Process import System.IO import Control.Exception main = do data <- readFile "core" (inp,out,err,pid) <- runInteractiveCommand "cat" print "before" finally (hPutStr inp data) (print "after")
This program, when run with a large enough core file in the current directory, will print "before" and then exit.
What happens (according to strace) is that the RTS closes the input end of the output pipe of the cat process (the one associated with the out variable). Then, cat tries to write some of its output and gets killed by SIGPIPE. This in turn closes the input end of its input pipe. When the Haskell program writes its next chunk of data, it is killed by SIGPIPE itself.
I believe the right fix for this is for the RTS to ignore SIGPIPE. The write syscall would then return EPIPE in the above scenario, which can be handled by the normal exception mechanism.