[GHC] #431: runInteractiveProcess and closed stdin.

GHC trac at galois.com
Fri Oct 20 09:45:35 EDT 2006


#431: runInteractiveProcess and closed stdin.
----------------------------+-----------------------------------------------
 Reporter:  nobody          |          Owner:  simonmar
     Type:  bug             |         Status:  assigned
 Priority:  low             |      Milestone:  6.8     
Component:  libraries/base  |        Version:  6.4     
 Severity:  normal          |     Resolution:  None    
 Keywords:                  |     Difficulty:  Unknown 
 Testcase:                  |   Architecture:  Unknown 
       Os:  Unknown         |  
----------------------------+-----------------------------------------------
Changes (by igloo):

  * architecture:  => Unknown
  * difficulty:  => Unknown
  * milestone:  => 6.8
  * testcase:  =>
  * os:  => Unknown

Old description:

> {{{
> Hello,
>
> The System.Process.runInteractiveProcess function
> doesn't seem to provide the child process with a stdin
> handle when the parent's stdin is closed. Below is a
> small example:
>
> import System.Process
> import Control.Concurrent
> import System.IO
>
> main = do
>   hClose stdin -- everything works as expected if the
> handle isn't closed.
>   putStrLn "Running cat ..."
>   (inp, out, err, pid) <- runInteractiveProcess "cat"
> [] Nothing Nothing
>   forkIO (hPutStrLn inp "foo" >> hClose inp)
>   forkIO (putStrLn =<< hGetContents out)
>   forkIO (putStrLn =<< hGetContents err)
>   -- Don't want to deal with waitForProcess and
> -threaded right now.
>   threadDelay 1000000
>   return ()
>
> Running this example produces the error
>
> % ghc Run.hs -o run
> % ./run
> Running cat ...
>
> cat: -: Bad file descriptor
> cat: closing standard input: Bad file descriptor
>

> I think the bug is in
> fptools/libraries/base/cbits/runProcess.c:
> //...
>     pipe(fdStdInput);
> //...
>         dup2 (fdStdInput[0], STDIN_FILENO);
> /...
>         close(fdStdInput[0]);
> //...
>
> pipe(...) will assign the lowest available file
> descriptors, i.e. 0 if stdin is closed. The dup2 won't
> do anything, since src and dest fds are identical, so
> close(...) will close the child's stdin immediately.
>

> % uname -a
> Linux mthomas 2.6.12 #2 Thu Jul 21 07:51:44 EDT 2005
> i686 GNU/Linux
> % ghc --version
> The Glorious Glasgow Haskell Compilation System,
> version 6.5.20050728
>
> Thanks,
>
> -- Thomas Jäger
> }}}

New description:

 {{{
 Hello,

 The System.Process.runInteractiveProcess function
 doesn't seem to provide the child process with a stdin
 handle when the parent's stdin is closed. Below is a
 small example:

 import System.Process
 import Control.Concurrent
 import System.IO

 main = do
   hClose stdin -- everything works as expected if the
 handle isn't closed.
   putStrLn "Running cat ..."
   (inp, out, err, pid) <- runInteractiveProcess "cat"
 [] Nothing Nothing
   forkIO (hPutStrLn inp "foo" >> hClose inp)
   forkIO (putStrLn =<< hGetContents out)
   forkIO (putStrLn =<< hGetContents err)
   -- Don't want to deal with waitForProcess and
 -threaded right now.
   threadDelay 1000000
   return ()

 Running this example produces the error

 % ghc Run.hs -o run
 % ./run
 Running cat ...

 cat: -: Bad file descriptor
 cat: closing standard input: Bad file descriptor


 I think the bug is in
 fptools/libraries/base/cbits/runProcess.c:
 //...
     pipe(fdStdInput);
 //...
         dup2 (fdStdInput[0], STDIN_FILENO);
 /...
         close(fdStdInput[0]);
 //...

 pipe(...) will assign the lowest available file
 descriptors, i.e. 0 if stdin is closed. The dup2 won't
 do anything, since src and dest fds are identical, so
 close(...) will close the child's stdin immediately.


 % uname -a
 Linux mthomas 2.6.12 #2 Thu Jul 21 07:51:44 EDT 2005
 i686 GNU/Linux
 % ghc --version
 The Glorious Glasgow Haskell Compilation System,
 version 6.5.20050728

 Thanks,

 -- Thomas Jäger
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/431>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list