[Haskell-cafe] Re: exitFailure under forkProcess
Andrew Pimlott
andrew at pimlott.net
Tue Oct 26 22:57:10 EDT 2004
On Wed, Oct 27, 2004 at 12:56:12AM +0000, John Goerzen wrote:
> If you follow this a little bit, you'll find that forkProcess is *NOT*
> throwing the exception that is being reported here. The message is
> being printed by the RTS of the child process. No exception is thrown
> in the parent. (Believe me, I've tried to catch it!)
I don't have any idea what's happening here, except that it semes an
obvious bug. I found that a work-around is to use exitImmediately in
the child. This is often advisable after a fork anyway, because you
don't want finalizers or atexit hooks to run in the child. Presumably,
it is some such code causing the breakage, though I can't imagine how.
On Wed, Oct 27, 2004 at 01:02:52AM +0000, John Goerzen wrote:
> Yes. Its POSIX interface is, uhm, weird. I can't quite put my finger
> on it, but things like setting up a pipe to a child process's stdin just
> seem brittle and fragile with all sorts of weird errors. I can do this
> in my sleep in C, Perl, or Python but in Haskell I can barely make it
> work when I'm fully conscious :-)
Actually, your bug aside, and despite minimal documentation, I've found
the Posix modules straightforward. I wrote a version of system that
returns the output of the command as a string, and it worked on the
first try! I'm sure there are better versions around, but:
system :: [String] -> IO String
system (cmd:args) = do
(read, write) <- createPipe
pid <- forkProcess (closeFd read >> child write)
closeFd write
ret <- fdToHandle read >>= hGetContents
length ret `seq` getProcessStatus True False pid
return ret
where
child write = do
dupTo write stdOutput
closeFd write
executeFile cmd
True -- path
args
Nothing -- env
Andrew
More information about the Haskell-Cafe
mailing list