[Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Magicloud Magiclouds
Hi,
  I have code like this and it leaves lots of zombies of flow-export.
Then I add waitForProcess Well I do not know where to put it.
Before or after 'hGetContents' both make the program hung.

exportCSV :: FilePath - IO [String]
exportCSV file = do
  csv_ - withBinaryFile file ReadMode $ \i - do
(_, Just o, _, h) - createProcess $ CreateProcess (RawCommand
/usr/bin/flow-export [-f2]) Nothing Nothing (UseHandle i)
CreatePipe Inherit True False
hGetContents o
  return $ tail $ lines csv_

-- 
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Ivan Lazar Miljenovic
On 5 September 2012 13:45, Magicloud Magiclouds
magicloud.magiclo...@gmail.com wrote:
 Hi,
   I have code like this and it leaves lots of zombies of flow-export.
 Then I add waitForProcess Well I do not know where to put it.
 Before or after 'hGetContents' both make the program hung.

You're probably being bitten by hGetContents being lazy.  Force the
result of hGetContents (e.g. `evaluate . length = hGetContents o ')
and then use waitForProcess.


 exportCSV :: FilePath - IO [String]
 exportCSV file = do
   csv_ - withBinaryFile file ReadMode $ \i - do
 (_, Just o, _, h) - createProcess $ CreateProcess (RawCommand
 /usr/bin/flow-export [-f2]) Nothing Nothing (UseHandle i)
 CreatePipe Inherit True False
 hGetContents o
   return $ tail $ lines csv_

 --
 竹密岂妨流水过
 山高哪阻野云飞

 And for G+, please use magiclouds#gmail.com.

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe



-- 
Ivan Lazar Miljenovic
ivan.miljeno...@gmail.com
http://IvanMiljenovic.wordpress.com

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Mike Ledger
You might have to use hGetContents, then waitForProcess, and then
terminateProcess -- you can then check if the process is indeed terminated
using getProcessExitCode.

On Wed, Sep 5, 2012 at 1:45 PM, Magicloud Magiclouds 
magicloud.magiclo...@gmail.com wrote:

 Hi,
   I have code like this and it leaves lots of zombies of flow-export.
 Then I add waitForProcess Well I do not know where to put it.
 Before or after 'hGetContents' both make the program hung.

 exportCSV :: FilePath - IO [String]
 exportCSV file = do
   csv_ - withBinaryFile file ReadMode $ \i - do
 (_, Just o, _, h) - createProcess $ CreateProcess (RawCommand
 /usr/bin/flow-export [-f2]) Nothing Nothing (UseHandle i)
 CreatePipe Inherit True False
 hGetContents o
   return $ tail $ lines csv_

 --
 竹密岂妨流水过
 山高哪阻野云飞

 And for G+, please use magiclouds#gmail.com.

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Magicloud Magiclouds
Forgot about that, just read 'readProcess' code to figure out.
Thanks.

On Wed, Sep 5, 2012 at 12:37 PM, Ivan Lazar Miljenovic
ivan.miljeno...@gmail.com wrote:
 On 5 September 2012 13:45, Magicloud Magiclouds
 magicloud.magiclo...@gmail.com wrote:
 Hi,
   I have code like this and it leaves lots of zombies of flow-export.
 Then I add waitForProcess Well I do not know where to put it.
 Before or after 'hGetContents' both make the program hung.

 You're probably being bitten by hGetContents being lazy.  Force the
 result of hGetContents (e.g. `evaluate . length = hGetContents o ')
 and then use waitForProcess.


 exportCSV :: FilePath - IO [String]
 exportCSV file = do
   csv_ - withBinaryFile file ReadMode $ \i - do
 (_, Just o, _, h) - createProcess $ CreateProcess (RawCommand
 /usr/bin/flow-export [-f2]) Nothing Nothing (UseHandle i)
 CreatePipe Inherit True False
 hGetContents o
   return $ tail $ lines csv_

 --
 竹密岂妨流水过
 山高哪阻野云飞

 And for G+, please use magiclouds#gmail.com.

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe



 --
 Ivan Lazar Miljenovic
 ivan.miljeno...@gmail.com
 http://IvanMiljenovic.wordpress.com



-- 
竹密岂妨流水过
山高哪阻野云飞

And for G+, please use magiclouds#gmail.com.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] How to waitForProcess?

2012-09-04 Thread Brandon Allbery
On Tue, Sep 4, 2012 at 9:39 PM, Mike Ledger eleventyn...@gmail.com wrote:

 You might have to use hGetContents, then waitForProcess, and then
 terminateProcess -- you can then check if the process is indeed terminated
 using getProcessExitCode.


Er?  When waitForProcess returns the process is dead; there's nothing to
terminateProcess.  If you do it the other way around then you may not get
full output.

For starters, I would not build up the CreateProcess record directly but
use the proc record and override it with your I/O definitions.  I've been
bit by this before (I think some older version of System.Process lacked
useful predefined records?).

There is a severe gotcha here if you do things naively (like your example
code does).  If there is more output than will fit in a pipe, *no* ordering
of read / wait in a single thread will work without deadlocking; you have
no choice but to do the read in a separate thread.  This is not a Haskell
issue, it is how pipes work on POSIX systems.  (I don't know if Windows has
the same problem.)

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe